SQL INSERT
uttalande används oftast för att infoga enskilda rader i en tabell.
Men du kan också infoga resultaten av en fråga i en tabell. Det betyder att du kan infoga flera rader samtidigt (så länge de returneras av frågan).
Grundläggande exempel
Här är ett grundläggande exempel att visa.
INSERT INTO Pets2
SELECT * FROM Pets;
Det infogar alla rader från Pets
tabell till Pets2
bord.
Det förutsätter att vi redan har skapat Pets2
tabell och att den har rätt definition.
Om det inte finns eller om det inte har rätt definition får du ett felmeddelande.
Infoga data från flera tabeller
Du kan använda den här metoden för att infoga data från flera tabeller.
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;
I det här exemplet infogade jag data från tre tabeller i en tabell som heter PetsTypesOwners
.
Observera att jag uttryckligen listade varje kolumn. Jag gjorde detta eftersom målkolumnen har färre kolumner än de tre tabellerna tillsammans. I det här fallet beror det på att om jag hade valt alla kolumner skulle frågan ha returnerat dubbletter av kolumner på grund av att främmande nycklar har samma namn och värde som deras primärnycklar.
Om jag vill inkludera de dubblettkolumnerna, skulle målkolumnen behöva inkludera de dubblettkolumnerna, men med ett annat namn för en av varje dubblettpar.
Här är ett exempel på hur du väljer alla kolumner (jag väljer dem explicit här, så att du kan se deras namn):
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;
Du kan se att det finns två kolumner som heter OwnerId
och två kallas PetTypeId
, var och en från olika bord. Dessa är primärnycklarna och främmande nycklar för deras respektive tabeller.
Eftersom dessa kolumner är dubbletter inkluderade jag bara en av varje i föregående exempel. Men för syftet med denna demo har jag inkluderat dem i det här exemplet.
Så för att tillgodose denna nya INSERT INTO... SELECT
sats, behöver vi att vår destinationstabell har rätt antal kolumner och med en kompatibel definition.
Därför kan vår destinationstabells definition se ut ungefär så här:
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)
);
I det här fallet prefixerade jag en av varje dubblettkolumn med Pet
. Specifikt skapade jag ett PetPetTypeId
(som mappas till p.OwnerId
kolumnen i frågan) och PetOwnerId
kolumn (som mappas till p.PetTypeId
kolumn i frågan).
Det är dock viktigt att notera att det inte spelar någon roll vad du kallar dina kolumner i destinationstabellen. INSERT INTO... SELECT
uttalandet bryr sig inte om det. INSERT INTO... SELECT
uttalandet är bara intresserad av kolumnordningen.
Infoga data från en vy
Du kan använda samma INSERT INTO... SELECT
syntax för att infoga data i en tabell från en vy.
Här är ett snabbt exempel:
INSERT INTO PetTypeCount
SELECT * FROM vPetTypeCount;
I det här fallet, vPetTypeCount
är en vy, och jag infogar dess innehåll i en tabell som heter PetTypeCount
.
Infoga data från en lagrad procedur
Vissa DBMS:er (som SQL Server) kan också använda samma INSERT INTO... SELECT
syntax för att infoga data i en tabell från en lagrad procedur.
Här är ett snabbt exempel:
INSERT INTO PetById
EXEC uspGetPetById 2;
Återigen, detta förutsätter att vi har en destinationstabell med korrekt definition.
Koden SELECT INTO
Uttalande
Beroende på ditt DBMS finns det också en SELECT INTO
uttalande, som du kan använda för att automatiskt skapa en ny tabell baserat på resultatuppsättningen, och sedan infoga den resultatuppsättningen i den.