Das SQL INSERT
-Anweisung wird am häufigsten verwendet, um einzelne Zeilen in eine Tabelle einzufügen.
Sie können aber auch die Ergebnisse einer Abfrage in eine Tabelle einfügen. Das bedeutet, dass Sie mehrere Zeilen gleichzeitig einfügen können (solange sie von der Abfrage zurückgegeben werden).
Einfaches Beispiel
Hier ist ein einfaches Beispiel zur Veranschaulichung.
INSERT INTO Pets2
SELECT * FROM Pets;
Das fügt alle Zeilen aus den Pets
ein Tabelle in Pets2
Tabelle.
Es wird davon ausgegangen, dass wir Pets2
bereits erstellt haben Tabelle und dass sie die richtige Definition hat.
Wenn es nicht existiert oder nicht die richtige Definition hat, erhalten Sie eine Fehlermeldung.
Daten aus mehreren Tabellen einfügen
Sie können diese Methode verwenden, um Daten aus mehreren Tabellen einzufügen.
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;
In diesem Beispiel habe ich Daten aus drei Tabellen in eine Tabelle namens PetsTypesOwners
eingefügt .
Beachten Sie, dass ich jede Spalte explizit aufgelistet habe. Ich habe dies getan, weil die Zielspalte weniger Spalten hat als die drei Tabellen zusammen. In diesem Fall liegt das daran, dass die Abfrage doppelte Spalten zurückgegeben hätte, wenn ich alle Spalten ausgewählt hätte, da Fremdschlüssel denselben Namen und denselben Wert wie ihre Primärschlüssel haben.
Wenn ich diese doppelten Spalten einschließen wollte, müsste die Zielspalte diese doppelten Spalten enthalten, aber mit einem anderen Namen für eine von jedem doppelten Paar.
Hier ist ein Beispiel für die Auswahl aller Spalten (ich wähle sie hier explizit aus, damit Sie ihre Namen sehen können):
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;
Sie können sehen, dass es zwei Spalten namens OwnerId
gibt und zwei namens PetTypeId
, jeweils aus einer anderen Tabelle. Dies sind die Primärschlüssel und Fremdschlüssel ihrer jeweiligen Tabellen.
Da es sich bei diesen Spalten um Duplikate handelt, habe ich im vorherigen Beispiel nur jeweils eine eingefügt. Aber für diese Demo habe ich sie in dieses Beispiel aufgenommen.
Also, um diesem neuen INSERT INTO... SELECT
gerecht zu werden -Anweisung benötigen wir unsere Zieltabelle, um die richtige Anzahl von Spalten und eine kompatible Definition zu haben.
Daher könnte die Definition unserer Zieltabelle etwa so aussehen:
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)
);
In diesem Fall habe ich einer jeder doppelten Spalte Pet
vorangestellt . Insbesondere habe ich eine PetPetTypeId
erstellt (was der p.OwnerId
zugeordnet ist Spalte in der Abfrage) und PetOwnerId
Spalte (die der p.PetTypeId
zugeordnet ist Spalte in der Abfrage).
Es ist jedoch wichtig zu beachten, dass es keine Rolle spielt, wie Sie Ihre Spalten in der Zieltabelle nennen. Der INSERT INTO... SELECT
Aussage kümmert sich nicht darum. Der INSERT INTO... SELECT
-Anweisung ist nur an der Spaltenreihenfolge interessiert.
Daten aus einer Ansicht einfügen
Sie können denselben INSERT INTO... SELECT
verwenden Syntax zum Einfügen von Daten in eine Tabelle aus einer Ansicht.
Hier ist ein kurzes Beispiel:
INSERT INTO PetTypeCount
SELECT * FROM vPetTypeCount;
In diesem Fall vPetTypeCount
ist eine Ansicht, und ich füge ihren Inhalt in eine Tabelle namens PetTypeCount
ein .
Daten aus einer gespeicherten Prozedur einfügen
Einige DBMS (wie SQL Server) können auch denselben INSERT INTO... SELECT
verwenden Syntax zum Einfügen von Daten in eine Tabelle aus einer gespeicherten Prozedur.
Hier ist ein kurzes Beispiel:
INSERT INTO PetById
EXEC uspGetPetById 2;
Dies setzt wiederum voraus, dass wir eine Zieltabelle mit der richtigen Definition haben.
Der SELECT INTO
Erklärung
Abhängig von Ihrem DBMS gibt es auch einen SELECT INTO
-Anweisung, die Sie verwenden können, um automatisch eine neue Tabelle basierend auf der Ergebnismenge zu erstellen, und fügen Sie dann diese Ergebnismenge darin ein.