SQL INSERT
příkaz se nejčastěji používá k vkládání jednotlivých řádků do tabulky.
Výsledky dotazu ale můžete také vložit do tabulky. To znamená, že můžete vložit více řádků najednou (pokud jsou vráceny dotazem).
Základní příklad
Zde je základní příklad k demonstraci.
INSERT INTO Pets2
SELECT * FROM Pets;
Tím se vloží všechny řádky z Pets
tabulky do Pets2
tabulka.
Předpokládá se, že jsme již vytvořili Pets2
a že má správnou definici.
Pokud neexistuje nebo nemá správnou definici, zobrazí se chyba.
Vložit data z více tabulek
Tuto metodu můžete použít k vložení dat z více tabulek.
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;
V tomto příkladu jsem vložil data ze tří tabulek do jedné tabulky s názvem PetsTypesOwners
.
Všimněte si, že jsem výslovně uvedl každý sloupec. Udělal jsem to, protože cílový sloupec má méně sloupců než tři tabulky dohromady. V tomto případě je to proto, že kdybych vybral všechny sloupce, dotaz by vrátil duplicitní sloupce kvůli cizím klíčům, které mají stejný název a hodnotu jako jejich primární klíče.
Pokud bych chtěl zahrnout tyto duplicitní sloupce, cílový sloupec by musel obsahovat tyto duplicitní sloupce, ale s jiným názvem pro jeden z každého duplicitního páru.
Zde je příklad výběru všech sloupců (zde je vyberu explicitně, abyste viděli jejich názvy):
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;
Můžete vidět, že existují dva sloupce nazvané OwnerId
a dva s názvem PetTypeId
, každý z jiné tabulky. Toto jsou primární klíče a cizí klíče příslušných tabulek.
Vzhledem k tomu, že tyto sloupce jsou duplicitní, zahrnul jsem do předchozího příkladu pouze jeden z každého z nich. Ale pro účely této ukázky jsem je zahrnul do tohoto příkladu.
Abychom vyhověli tomuto novému INSERT INTO... SELECT
potřebujeme, aby naše cílová tabulka měla správný počet sloupců a kompatibilní definici.
Proto může definice naší cílové tabulky vypadat nějak takto:
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)
);
V tomto případě jsem před jeden z každého duplicitního sloupce přidal předponu Pet
. Konkrétně jsem vytvořil PetPetTypeId
(který se mapuje na p.OwnerId
sloupec v dotazu) a PetOwnerId
sloupec (který mapuje na p.PetTypeId
sloupec v dotazu).
Je však důležité poznamenat, že nezáleží na tom, jak nazýváte své sloupce v cílové tabulce. INSERT INTO... SELECT
prohlášení se o to nestará. INSERT INTO... SELECT
výpis se zajímá pouze o pořadí sloupců.
Vložit data z pohledu
Můžete použít stejný INSERT INTO... SELECT
syntaxe pro vložení dat do tabulky z pohledu.
Zde je rychlý příklad:
INSERT INTO PetTypeCount
SELECT * FROM vPetTypeCount;
V tomto případě vPetTypeCount
je pohled a jeho obsah vkládám do tabulky s názvem PetTypeCount
.
Vložit data z uložené procedury
Některé DBMS (jako je SQL Server) mohou také používat stejné INSERT INTO... SELECT
syntaxe pro vložení dat do tabulky z uložené procedury.
Zde je rychlý příklad:
INSERT INTO PetById
EXEC uspGetPetById 2;
Opět to předpokládá, že máme cílovou tabulku se správnou definicí.
SELECT INTO
Prohlášení
V závislosti na vašem DBMS existuje také SELECT INTO
příkaz, který můžete použít k automatickému vytvoření nové tabulky na základě sady výsledků a poté do ní tuto sadu výsledků vložit.