SQL INSERT
Instrukcja jest najczęściej używana do wstawiania pojedynczych wierszy do tabeli.
Ale możesz także wstawić wyniki zapytania do tabeli. Oznacza to, że możesz wstawić wiele wierszy naraz (o ile zostaną zwrócone przez zapytanie).
Przykład podstawowy
Oto podstawowy przykład do zademonstrowania.
INSERT INTO Pets2
SELECT * FROM Pets;
To wstawia wszystkie wiersze z Pets
tabeli do Pets2
tabela.
Zakłada, że stworzyliśmy już Pets2
tabeli i czy ma poprawną definicję.
Jeśli nie istnieje lub nie ma prawidłowej definicji, pojawi się błąd.
Wstaw dane z wielu tabel
Możesz użyć tej metody, aby wstawić dane z wielu tabel.
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;
W tym przykładzie wstawiłem dane z trzech tabel do jednej tabeli o nazwie PetsTypesOwners
.
Zauważ, że wyraźnie wymieniłem każdą kolumnę. Zrobiłem to, ponieważ kolumna docelowa ma mniej kolumn niż trzy tabele razem wzięte. W tym przypadku dzieje się tak dlatego, że gdybym wybrał wszystkie kolumny, zapytanie zwróciłoby zduplikowane kolumny, ponieważ klucze obce mają taką samą nazwę i wartość jak ich klucze podstawowe.
Gdybym chciał uwzględnić te zduplikowane kolumny, kolumna docelowa musiałaby zawierać te zduplikowane kolumny, ale z inną nazwą dla jednej z każdej zduplikowanej pary.
Oto przykład zaznaczenia wszystkich kolumn (wybiorę je tutaj wyraźnie, abyś mógł zobaczyć ich nazwy):
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;
Widać, że istnieją dwie kolumny o nazwie OwnerId
i dwa o nazwie PetTypeId
, każdy z innej tabeli. Są to klucze podstawowe i klucze obce odpowiednich tabel.
Biorąc pod uwagę, że te kolumny są duplikatami, w poprzednim przykładzie uwzględniłem tylko jedną z nich. Ale na potrzeby tego demo umieściłem je w tym przykładzie.
Aby zaspokoić ten nowy INSERT INTO... SELECT
oświadczenie, potrzebujemy, aby nasza tabela docelowa miała odpowiednią liczbę kolumn i zgodną definicję.
Dlatego definicja naszej tabeli docelowej może wyglądać mniej więcej tak:
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)
);
W tym przypadku poprzedziłem jedną z każdej zduplikowanej kolumny przedrostkiem Pet
. W szczególności utworzyłem PetPetTypeId
(który mapuje do p.OwnerId
w zapytaniu) i PetOwnerId
kolumna (która mapuje do p.PetTypeId
w zapytaniu).
Należy jednak pamiętać, że nie ma znaczenia, jak nazwiesz swoje kolumny w tabeli docelowej. INSERT INTO... SELECT
oświadczenie to nie obchodzi. INSERT INTO... SELECT
oświadczenie jest zainteresowane tylko kolejnością kolumn.
Wstaw dane z widoku
Możesz użyć tego samego INSERT INTO... SELECT
składnia do wstawiania danych do tabeli z widoku.
Oto krótki przykład:
INSERT INTO PetTypeCount
SELECT * FROM vPetTypeCount;
W tym przypadku vPetTypeCount
jest widokiem i wstawiam jego zawartość do tabeli o nazwie PetTypeCount
.
Wstaw dane z procedury przechowywanej
Niektóre DBMS (takie jak SQL Server) mogą również używać tego samego INSERT INTO... SELECT
składnia do wstawiania danych do tabeli z procedury składowanej.
Oto krótki przykład:
INSERT INTO PetById
EXEC uspGetPetById 2;
Ponownie zakładamy, że mamy tabelę docelową z poprawną definicją.
SELECT INTO
Oświadczenie
W zależności od DBMS, istnieje również SELECT INTO
oświadczenie, którego możesz użyć do automatycznego utworzenia nowej tabeli na podstawie zestawu wyników, a następnie wstaw do niego ten zestaw wyników.