O SQL
INSERT
A instrução é mais comumente usada para inserir linhas individuais em uma tabela. Mas você também pode inserir os resultados de uma consulta em uma tabela. Isso significa que você pode inserir várias linhas de uma vez (desde que sejam retornadas pela consulta).
Exemplo básico
Aqui está um exemplo básico para demonstrar.
INSERT INTO Pets2
SELECT * FROM Pets;
Isso insere todas as linhas do
Pets
tabela em Pets2
tabela. Ele assume que já criamos o
Pets2
tabela e que tem a definição correta. Se não existir ou se não tiver a definição correta, você receberá um erro.
Inserir dados de várias tabelas
Você pode usar esse método para inserir dados de várias tabelas.
INSERT INTO PetsTypesOwners
SELECT
p.PetId,
p.PetName,
p.DOB,
pt.PetTypeId,
pt.PetType,
o.OwnerId,
o.FirstName,
o.LastName,
o.Phone,
o.Email
FROM Pets p
INNER JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId
INNER JOIN Owners o
ON p.OwnerId = o.OwnerId;
Neste exemplo, inseri dados de três tabelas em uma tabela chamada
PetsTypesOwners
. Observe que listei explicitamente cada coluna. Eu fiz isso porque a coluna de destino tem menos colunas do que as três tabelas combinadas. Nesse caso, é porque, se eu tivesse selecionado todas as colunas, a consulta teria retornado colunas duplicadas devido a chaves estrangeiras com o mesmo nome e valor de suas chaves primárias.
Se eu quisesse incluir essas colunas duplicadas, a coluna de destino precisaria incluir essas colunas duplicadas, mas com um nome diferente para cada par duplicado.
Aqui está um exemplo de seleção de todas as colunas (vou selecioná-las explicitamente aqui, para que você possa ver seus nomes):
INSERT INTO PetsTypesOwners2
SELECT
p.PetId,
p.OwnerId,
p.PetTypeId,
p.PetName,
p.DOB,
pt.PetTypeId,
pt.PetType,
o.OwnerId,
o.FirstName,
o.LastName,
o.Phone,
o.Email
FROM Pets p
INNER JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId
INNER JOIN Owners o
ON p.OwnerId = o.OwnerId;
Você pode ver que existem duas colunas chamadas
OwnerId
e dois chamados PetTypeId
, cada um de uma tabela diferente. Essas são as chaves primárias e estrangeiras de suas respectivas tabelas. Dado que essas colunas são duplicadas, incluí apenas uma de cada no exemplo anterior. Mas para o propósito desta demonstração, incluí-os neste exemplo.
Então, para atender a este novo
INSERT INTO... SELECT
, precisamos que nossa tabela de destino tenha o número correto de colunas e com uma definição compatível. Portanto, a definição da nossa tabela de destino pode ser algo assim:
CREATE TABLE PetsTypesOwners2 (
PetId int NOT NULL PRIMARY KEY,
PetPetType varchar(60) NOT NULL,
PetOwnerId int NOT NULL,
PetName varchar(60) NOT NULL,
DOB date NULL,
PetTypeId int NOT NULL,
PetType varchar(60) NOT NULL,
OwnerId int NOT NULL,
FirstName varchar(60) NOT NULL,
LastName varchar(60) NOT NULL,
Phone varchar(20) NOT NULL,
Email varchar(254)
);
Nesse caso, prefixei uma de cada coluna duplicada com
Pet
. Especificamente, criei um PetPetTypeId
(que mapeia para o p.OwnerId
coluna na consulta) e PetOwnerId
coluna (que mapeia para o p.PetTypeId
coluna na consulta). É importante notar, porém, que não importa como você chama suas colunas na tabela de destino. O
INSERT INTO... SELECT
declaração não se importa com isso. O INSERT INTO... SELECT
instrução está interessada apenas na ordem das colunas. Inserir dados de uma visualização
Você pode usar o mesmo
INSERT INTO... SELECT
sintaxe para inserir dados em uma tabela de uma exibição. Aqui está um exemplo rápido:
INSERT INTO PetTypeCount
SELECT * FROM vPetTypeCount;
Nesse caso,
vPetTypeCount
é uma view, e estou inserindo seu conteúdo em uma tabela chamada PetTypeCount
. Inserir dados de um procedimento armazenado
Alguns DBMSs (como SQL Server) também podem usar o mesmo
INSERT INTO... SELECT
sintaxe para inserir dados em uma tabela de um procedimento armazenado. Aqui está um exemplo rápido:
INSERT INTO PetById
EXEC uspGetPetById 2;
Novamente, isso pressupõe que temos uma tabela de destino com a definição correta.
O SELECT INTO
Declaração
Dependendo do seu DBMS, há também um
SELECT INTO
declaração, que você pode usar para criar automaticamente uma nova tabela com base no conjunto de resultados e, em seguida, inserir esse conjunto de resultados nela.