SQL INSERT
операторът се използва най-често за вмъкване на отделни редове в таблица.
Но можете също да вмъкнете резултатите от заявка в таблица. Това означава, че можете да вмъкнете няколко реда наведнъж (стига да бъдат върнати от заявката).
Основен пример
Ето основен пример за демонстрация.
INSERT INTO Pets2
SELECT * FROM Pets;
Това вмъква всички редове от Pets
таблица в Pets2
таблица.
Предполага се, че вече сме създали Pets2
таблица и че има правилната дефиниция.
Ако не съществува или ако няма правилната дефиниция, ще получите грешка.
Вмъкване на данни от множество таблици
Можете да използвате този метод за вмъкване на данни от множество таблици.
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;
В този пример вмъкнах данни от три таблици в една таблица, наречена PetsTypesOwners
.
Имайте предвид, че изрично посочих всяка колона. Направих това, защото колоната дестинация има по-малко колони от трите таблици, взети заедно. В този случай това е така, защото ако бях избрал всички колони, заявката щеше да върне дублиращи се колони поради външните ключове със същото име и стойност като техните първични ключове.
Ако искам да включа тези дублиращи се колони, колоната дестинация ще трябва да включва тези дублиращи се колони, но с различно име за една от всяка двойка дублирани.
Ето пример за избор на всички колони (ще ги избера изрично тук, за да можете да видите имената им):
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;
Можете да видите, че има две колони, наречени OwnerId
и две, наречени PetTypeId
, всеки от различна таблица. Това са първичните и външните ключове на съответните им таблици.
Като се има предвид, че тези колони са дублирани, включих само една от всяка в предишния пример. Но за целите на тази демонстрация ги включих в този пример.
За да се погрижим за този нов INSERT INTO... SELECT
изявление, ние се нуждаем нашата целева таблица да има правилния брой колони и със съвместима дефиниция.
Следователно дефиницията на нашата таблица за дестинация може да изглежда така:
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)
);
В този случай поставих префикс към една от всяка дублирана колона с Pet
. По-конкретно, създадох PetPetTypeId
(което се съпоставя с p.OwnerId
колона в заявката) и PetOwnerId
колона (която съответства на p.PetTypeId
колона в заявката).
Важно е да се отбележи обаче, че няма значение как наричате колоните си в таблицата на местоназначението. INSERT INTO... SELECT
изявлението не се интересува от това. INSERT INTO... SELECT
изявлението се интересува само от реда на колоните.
Вмъкване на данни от изглед
Можете да използвате същия INSERT INTO... SELECT
синтаксис за вмъкване на данни в таблица от изглед.
Ето един бърз пример:
INSERT INTO PetTypeCount
SELECT * FROM vPetTypeCount;
В този случай vPetTypeCount
е изглед и вмъквам съдържанието му в таблица, наречена PetTypeCount
.
Вмъкване на данни от съхранена процедура
Някои СУБД (като SQL Server) също могат да използват същия INSERT INTO... SELECT
синтаксис за вмъкване на данни в таблица от съхранена процедура.
Ето един бърз пример:
INSERT INTO PetById
EXEC uspGetPetById 2;
Отново, това предполага, че имаме таблица дестинация с правилната дефиниция.
SELECT INTO
Изявление
В зависимост от вашата СУБД има и SELECT INTO
изявление, което можете да използвате за автоматично създаване на нова таблица въз основа на набора от резултати, след което вмъкнете този набор от резултати в нея.