L'SQL INSERT
istruzione è più comunemente usata per inserire singole righe in una tabella.
Ma puoi anche inserire i risultati di una query in una tabella. Ciò significa che puoi inserire più righe contemporaneamente (purché vengano restituite dalla query).
Esempio di base
Ecco un esempio di base da dimostrare.
INSERT INTO Pets2
SELECT * FROM Pets;
Ciò inserisce tutte le righe da Pets
tabella in Pets2
tabella.
Presuppone che abbiamo già creato Pets2
tabella e che abbia la definizione corretta.
Se non esiste o se non ha la definizione corretta, riceverai un errore.
Inserisci dati da più tabelle
Puoi utilizzare questo metodo per inserire dati da più tabelle.
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 questo esempio ho inserito i dati di tre tabelle in una tabella chiamata PetsTypesOwners
.
Nota che ho elencato esplicitamente ogni colonna. L'ho fatto perché la colonna di destinazione ha meno colonne delle tre tabelle combinate. In questo caso, è perché, se avessi selezionato tutte le colonne, la query avrebbe restituito colonne duplicate a causa delle chiavi esterne con lo stesso nome e valore delle chiavi primarie.
Se volessi includere quelle colonne duplicate, la colonna di destinazione dovrebbe includere quelle colonne duplicate, ma con un nome diverso per una di ciascuna coppia duplicata.
Ecco un esempio di selezione di tutte le colonne (le selezionerò esplicitamente qui, così puoi vedere i loro nomi):
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;
Puoi vedere che ci sono due colonne chiamate OwnerId
e due chiamati PetTypeId
, ognuno da una tabella diversa. Queste sono le chiavi primarie e le chiavi esterne delle rispettive tabelle.
Dato che quelle colonne sono duplicate, ne ho inclusa solo una nell'esempio precedente. Ma ai fini di questa demo, li ho inclusi in questo esempio.
Quindi, per soddisfare questo nuovo INSERT INTO... SELECT
istruzione, abbiamo bisogno che la nostra tabella di destinazione abbia il numero corretto di colonne e con una definizione compatibile.
Pertanto, la definizione della nostra tabella di destinazione potrebbe assomigliare a questa:
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 questo caso, ho anteposto a una di ciascuna colonna duplicata Pet
. In particolare, ho creato un PetPetTypeId
(che si associa a p.OwnerId
colonna nella query) e PetOwnerId
colonna (che esegue il mapping a p.PetTypeId
colonna nella query).
È importante notare, tuttavia, che non importa come chiami le tue colonne nella tabella di destinazione. Il INSERT INTO... SELECT
l'affermazione non si preoccupa di questo. Il INSERT INTO... SELECT
l'istruzione è interessata solo all'ordine delle colonne.
Inserisci dati da una vista
Puoi usare lo stesso INSERT INTO... SELECT
sintassi per inserire dati in una tabella da una vista.
Ecco un rapido esempio:
INSERT INTO PetTypeCount
SELECT * FROM vPetTypeCount;
In questo caso, vPetTypeCount
è una vista e ne sto inserendo il contenuto in una tabella chiamata PetTypeCount
.
Inserimento di dati da una stored procedure
Alcuni DBMS (come SQL Server) possono anche utilizzare lo stesso INSERT INTO... SELECT
sintassi per inserire dati in una tabella da una procedura memorizzata.
Ecco un rapido esempio:
INSERT INTO PetById
EXEC uspGetPetById 2;
Di nuovo, questo presuppone che abbiamo una tabella di destinazione con la definizione corretta.
Il SELECT INTO
Dichiarazione
A seconda del tuo DBMS, c'è anche un SELECT INTO
istruzione, che puoi utilizzare per creare automaticamente una nuova tabella in base al set di risultati, quindi inserire quel set di risultati al suo interno.