INSERT |
O comando INSERT é utilizado para inserir linhas numa tabela e como todos os outros comandos do conjunto DML faz sempre parte de uma transacção. Neste módulo vamos ver:
INSERT
O comando INSERT permmite inserir uma única linha na tabela.
Os comandos da lista abaixo criam um conjunto de tabelas que vamos usar como exemplo. A descrição destes comandos encontra-se aqui.
drop table CONTRATADO cascade constraints; drop table JOGO cascade constraints; drop table JOGADOR cascade constraints; drop table EQUIPA cascade constraints; create table EQUIPA ( ID_EQUIPA NUMBER(10,0) not null, NOME VARCHAR2(100) constraint nn_equipa_nome not null, constraint PK_EQUIPA primary key (ID_EQUIPA) ); create table JOGADOR ( ID_JOGADOR NUMBER(10,0) not null, NOME varchar2(100) not null, POSICAO varchar2(100) not null, BI VARCHAR(100), constraint PK_JOGADOR primary key (ID_JOGADOR), constraint UK_JOGADOR unique (BI) ); create table JOGO ( EQUIPA_CASA NUMBER(10,0) not null, EQUIPA_VISITANTE NUMBER(10,0) not null, DATA DATE not null, LOCAL VARCHAR2(100) default 'Estádio Alvalade XXI' not null, RISCO_SEGURANCA VARCHAR(100) not null, constraint PK_JOGO primary key (EQUIPA_CASA, EQUIPA_VISITANTE, DATA), constraint FK_JOGO_REF_EQUIPA_CASA foreign key (EQUIPA_CASA) references EQUIPA (ID_EQUIPA), constraint FK_JOGO_REF_EQUIPA_VISITANTE foreign key (EQUIPA_VISITANTE) references EQUIPA (ID_EQUIPA), constraint CK_JOGO_01 check (risco_seguranca in ('Alto','Medio','Baixo') and equipa_casa != equipa_visitante) ); create table CONTRATADO ( ID_JOGADOR NUMBER(10,0) not null, ID_EQUIPA NUMBER(10,0) not null, DATA_INICIO DATE not null, DATA_FIM DATE not null, constraint PK_CONTRATADO primary key (ID_JOGADOR, ID_EQUIPA, DATA_INICIO), constraint FK_CONTRATA_REFERENCE_JOGADOR foreign key (ID_JOGADOR) references JOGADOR (ID_JOGADOR), constraint FK_CONTRATA_REFERENCE_EQUIPA foreign key (ID_EQUIPA) references EQUIPA (ID_EQUIPA), constraint CKT_CONTRATADO check (data_inicio < data_fim) ); |
Error starting at line 1 in command: drop table CONTRATADO cascade constraints Error report: SQL Error: ORA-00942: table or view does not exist Error starting at line 3 in command: drop table JOGO cascade constraints Error report: SQL Error: ORA-00942: table or view does not exist Error starting at line 5 in command: drop table JOGADOR cascade constraints Error report: SQL Error: ORA-00942: table or view does not exist Error starting at line 7 in command: drop table EQUIPA cascade constraints Error report: SQL Error: ORA-00942: table or view does not exist create table succeeded. create table succeeded. create table succeeded. create table succeeded. |
As tabelas e respectivo relacionamento pode ser descrito pelo diagrama abaixo:
Os comandos da lista abaixo inserem linhas nas tabelas:
insert into equipa (id_equipa, nome) values (1,'Sport Lisboa e Benfica'); insert into equipa (id_equipa, nome) values (2,'Futebol Clube do Porto'); insert into equipa (id_equipa, nome) values (3,'Sporting Clube de Portugal'); insert into jogador (id_jogador,nome,posicao,bi) values (1,'Simão Sabrosa','Médio atacante','123456789'); insert into jogador (id_jogador,nome,posicao,bi) values (2,'Moreira','Guarda redes', null); insert into jogador (id_jogador,nome,posicao) values (3,'Costinha','Médio'); insert into jogador (id_jogador,nome,posicao) values (4,'Victor Baia','Guarda redes'); insert into jogador (id_jogador,nome,posicao) values (5,'Ricardo','Guarda redes'); insert into jogador (id_jogador,nome,posicao) values (6,'Levezinho','Guarda redes'); insert into contratado (id_jogador,id_equipa,data_inicio,data_fim) values (1,1,to_date('20030101','yyyymmdd'),to_date('20090101','yyyymmdd')); insert into contratado (id_jogador,id_equipa,data_inicio,data_fim) values (2,1,to_date('20030101','yyyymmdd'),to_date('20090101','yyyymmdd')); insert into contratado (id_jogador,id_equipa,data_inicio,data_fim) values (3,2,to_date('20030101','yyyymmdd'),to_date('20090101','yyyymmdd')); insert into contratado (id_jogador,id_equipa,data_inicio,data_fim) values (4,2,to_date('20030101','yyyymmdd'),to_date('20090101','yyyymmdd')); insert into contratado (id_jogador,id_equipa,data_inicio,data_fim) values (5,3,to_date('20030101','yyyymmdd'),to_date('20090101','yyyymmdd')); insert into contratado (id_jogador,id_equipa,data_inicio,data_fim) values (6,3,to_date('20030101','yyyymmdd'),to_date('20090101','yyyymmdd')); --Simão Sabrosa foi contratado pelo Sporting antes de ser contratado pelo Benfica insert into contratado (id_jogador,id_equipa,data_inicio,data_fim) values (1,3,to_date('20000101','yyyymmdd'),to_date('20021201','yyyymmdd')); insert into jogo (equipa_casa,equipa_visitante,data,local,risco_seguranca) values (3,1,to_date('20051123','yyyymmdd'),'Estadio Alvalade XXI','Alto'); insert into jogo (equipa_casa,equipa_visitante,data,local,risco_seguranca) values (1,3,to_date('20060420','yyyymmdd'),'Estadio da Luz','Alto'); |
1 rows inserted 1 rows inserted 1 rows inserted 1 rows inserted 1 rows inserted 1 rows inserted 1 rows inserted 1 rows inserted 1 rows inserted 1 rows inserted 1 rows inserted 1 rows inserted 1 rows inserted 1 rows inserted 1 rows inserted 1 rows inserted 1 rows inserted 1 rows inserted |
A sintaxe do comando INSERT permite a omissão da lista de colunas. Neste caso a base de dados assume que a lista de valores inclui dados para todas as colunas que constituem a tabela na sequência em que elas foram criadas. Esta sequência pode ser obtida usando o comando DESCRIBE (DESC) do SQL*Plus ou fazendo SELECT * .
O exemplo abaixo insere duas linhas na tabela JOGO usando comandos INSERT onde não são indicadas as colunas.
insert into jogo values (2,3,to_date('20051020','yyyymmdd'),'Estadio do Dragão','Alto'); insert into jogo values (3,2,to_date('20060320','yyyymmdd'),'Estadio Alvalade XXI','Alto'); |
1 rows inserted 1 rows inserted |
A utilização desta última sintaxe é desaconselhada, principalmente quando o código SQL está dentro de uma aplicação (Java, C, COBOL, etc) pelas seguintes razões:
INSERT SELECT
O comando INSERT pode receber a cláusula SELECT o que permite inserir numa única operação todas as linhas resultantes da execução de um comando SELECT. Este comando pode ser simples ou complexo, o que significa que as linhas inseridas podem ser uma cópia directa de outra tabela ou podem ser o resultado de um query complexo com subconsultas e junções. Este comando tem níveis de desempenho muito bons.
O exemplo abaixo será analisado no módulo de criação de tabelas. Ele permite criar uma tabela a partir do resultado de um comando SELECT. As restrições existentes nas tabelas originais não são recriadas na nova tabela:
drop table EMP_SALS; create table EMP_SALS (emp_name, salary, grade) as ( select e.ename, e.sal, s.grade from emp e, salgrade s where e.sal between s.losal and s.hisal ); |
Error starting at line 1 in command: drop table EMP_SALS Error report: SQL Error: ORA-00942: table or view does not exist create table succeeded. |
O exemplo abaixo usa um comando INSERT SELECT para duplicar as linhas da tabela criada no ponto anterior:
insert into EMP_SALS select * from EMP_SALS; |
14 rows inserted |
Realizado por Turtle Learning ®. Última alteração em 2011-02-26