SQL INSERT
sætning bruges mest til at indsætte individuelle rækker i en tabel.
Men du kan også indsætte resultaterne af en forespørgsel i en tabel. Det betyder, at du kan indsætte flere rækker på én gang (så længe de returneres af forespørgslen).
Grundlæggende eksempel
Her er et grundlæggende eksempel at demonstrere.
INSERT INTO Pets2SELECT * FRA Pets;
Det indsætter alle rækker fra Kæledyr
tabel til Kæledyr2
tabel.
Det antager, at vi allerede har oprettet Pets2
tabel, og at den har den korrekte definition.
Hvis det ikke findes, eller hvis det ikke har den korrekte definition, får du en fejl.
Indsæt data fra flere tabeller
Du kan bruge denne metode til at indsætte data fra flere tabeller.
INSERT INTO PetsTypesOwnersSELECT p.PetId, p.PetName, p.DOB, pt.PetTypeId, pt.PetType, o.OwnerId, o.FirstName, o.LastName, o.Phone, o.EmailFROM Pets p INNER JOIN PetTypes pt ON p.PetTypeId =pt.PetTypeId INNER JOIN Ejere o ON p.OwnerId =o.OwnerId;
I dette eksempel indsatte jeg data fra tre tabeller i en tabel kaldet PetsTypesOwners
.
Bemærk, at jeg udtrykkeligt har angivet hver kolonne. Jeg gjorde dette, fordi destinationskolonnen har færre kolonner end de tre tabeller tilsammen. I dette tilfælde er det fordi, hvis jeg havde valgt alle kolonner, ville forespørgslen have returneret duplikerede kolonner på grund af fremmednøgler med samme navn og værdi som deres primære nøgler.
Hvis jeg ville inkludere disse dubletkolonner, skulle destinationskolonnen inkludere disse dubletkolonner, men med et andet navn for en af hvert dubletpar.
Her er et eksempel på valg af alle kolonner (jeg vælger dem eksplicit her, så du kan se deres navne):
INSERT INTO PetsTypesOwners2SELECT p.PetId, p.OwnerId, p.PetTypeId, p.PetName, p.DOB, pt.PetTypeId, pt.PetType, o.OwnerId, o.FirstName, o.LastName, o .Phone, o.EmailFROM Pets p INNER JOIN PetTypes pt ON p.PetTypeId =pt.PetTypeId INNER JOIN Ejere o ON p.OwnerId =o.OwnerId;
Du kan se, at der er to kolonner kaldet OwnerId
og to kaldet PetTypeId
, hver fra et andet bord. Disse er de primære nøgler og fremmednøgler i deres respektive tabeller.
Da disse kolonner er dubletter, inkluderede jeg kun én af hver i det foregående eksempel. Men til formålet med denne demo, har jeg inkluderet dem i dette eksempel.
Så for at tage højde for denne nye INSERT INTO...SELECT
sætning, har vi brug for, at vores destinationstabel har det korrekte antal kolonner og med en kompatibel definition.
Derfor kan vores destinationstabels definition se nogenlunde sådan ud:
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, PetType NULL,(PET NOTyp 60) NOT NULL, OwnerId int NOT NULL, FirstName varchar(60) NOT NULL, Efternavn varchar(60) NOT NULL, Telefon varchar(20) NOT NULL, Email varchar(254));
I dette tilfælde har jeg præfikset en af hver dubletkolonne med Pet
. Specifikt oprettede jeg et PetPetTypeId
(som er knyttet til p.OwnerId
kolonne i forespørgslen) og PetOwnerId
kolonne (som er knyttet til p.PetTypeId
kolonne i forespørgslen).
Det er dog vigtigt at bemærke, at det er ligegyldigt, hvad du kalder dine kolonner i destinationstabellen. INSERT INTO... SELECT
udtalelsen er ligeglad med det. INSERT INTO... SELECT
erklæring er kun interesseret i kolonnerækkefølgen.
Indsæt data fra en visning
Du kan bruge den samme INSERT INTO... SELECT
syntaks for at indsætte data i en tabel fra en visning.
Her er et hurtigt eksempel:
INSERT INTO PetTypeCountSELECT * FRA vPetTypeCount;
I dette tilfælde vPetTypeCount
er en visning, og jeg indsætter dens indhold i en tabel kaldet PetTypeCount
.
Indsæt data fra en lagret procedure
Nogle DBMS'er (såsom SQL Server) kan også bruge den samme INSERT INTO... SELECT
syntaks til at indsætte data i en tabel fra en lagret procedure.
Her er et hurtigt eksempel:
INSERT INTO PetByIdEXEC uspGetPetById 2;
Igen forudsætter dette, at vi har en destinationstabel med den korrekte definition.
SELECT INTO Erklæring
Afhængigt af dit DBMS er der også en SELECT INTO
sætning, som du kan bruge til automatisk at oprette en ny tabel baseret på resultatsættet, og derefter indsætte det resultatsæt i det.