Le SQL INSERT
est le plus souvent utilisé pour insérer des lignes individuelles dans un tableau.
Mais vous pouvez également insérer les résultats d'une requête dans une table. Cela signifie que vous pouvez insérer plusieurs lignes à la fois (tant qu'elles sont renvoyées par la requête).
Exemple de base
Voici un exemple de base pour illustrer.
INSERT INTO Pets2
SELECT * FROM Pets;
Cela insère toutes les lignes de Pets
table dans Pets2
tableau.
Il suppose que nous avons déjà créé le Pets2
table et qu'elle a la bonne définition.
S'il n'existe pas ou s'il n'a pas la bonne définition, vous obtiendrez une erreur.
Insérer des données de plusieurs tables
Vous pouvez utiliser cette méthode pour insérer des données à partir de plusieurs tables.
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;
Dans cet exemple, j'ai inséré des données de trois tables dans une table appelée PetsTypesOwners
.
Notez que j'ai explicitement listé chaque colonne. J'ai fait cela parce que la colonne de destination a moins de colonnes que les trois tables combinées. Dans ce cas, c'est parce que, si j'avais sélectionné toutes les colonnes, la requête aurait renvoyé des colonnes en double en raison de clés étrangères ayant le même nom et la même valeur que leurs clés primaires.
Si je voulais inclure ces colonnes en double, la colonne de destination devrait inclure ces colonnes en double, mais avec un nom différent pour une de chaque paire en double.
Voici un exemple de sélection de toutes les colonnes (je les sélectionnerai explicitement ici, afin que vous puissiez voir leurs noms) :
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;
Vous pouvez voir qu'il y a deux colonnes appelées OwnerId
et deux appelés PetTypeId
, chacun d'une table différente. Ce sont les clés primaires et les clés étrangères de leurs tables respectives.
Étant donné que ces colonnes sont des doublons, je n'en ai inclus qu'une de chaque dans l'exemple précédent. Mais pour les besoins de cette démo, je les ai inclus dans cet exemple.
Donc, pour répondre à ce nouveau INSERT INTO... SELECT
déclaration, nous avons besoin que notre table de destination ait le nombre correct de colonnes et avec une définition compatible.
Par conséquent, la définition de notre table de destination pourrait ressembler à ceci :
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)
);
Dans ce cas, j'ai préfixé une de chaque colonne en double avec Pet
. Plus précisément, j'ai créé un PetPetTypeId
(qui correspond au p.OwnerId
colonne dans la requête) et PetOwnerId
colonne (qui correspond à la colonne p.PetTypeId
colonne dans la requête).
Il est important de noter cependant que peu importe comment vous appelez vos colonnes dans la table de destination. Le INSERT INTO... SELECT
déclaration ne se soucie pas de cela. Le INSERT INTO... SELECT
L'instruction ne s'intéresse qu'à l'ordre des colonnes.
Insérer des données à partir d'une vue
Vous pouvez utiliser le même INSERT INTO... SELECT
syntaxe pour insérer des données dans une table à partir d'une vue.
Voici un exemple rapide :
INSERT INTO PetTypeCount
SELECT * FROM vPetTypeCount;
Dans ce cas, vPetTypeCount
est une vue, et j'insère son contenu dans une table appelée PetTypeCount
.
Insérer des données à partir d'une procédure stockée
Certains SGBD (tels que SQL Server) peuvent également utiliser le même INSERT INTO... SELECT
syntaxe pour insérer des données dans une table à partir d'une procédure stockée.
Voici un exemple rapide :
INSERT INTO PetById
EXEC uspGetPetById 2;
Encore une fois, cela suppose que nous avons une table de destination avec la bonne définition.
Le SELECT INTO
Déclaration
Selon votre SGBD, il y a aussi un SELECT INTO
, que vous pouvez utiliser pour créer automatiquement une nouvelle table basée sur le jeu de résultats, puis insérez-y ce jeu de résultats.