INSERTer en SQL- kommando, der tilføjer en eller flere tupler til en tabel i en relationsdatabase .
INSERT- kommandoen har følgende syntaks:
INSERT INTO table (column1 [, column2, column3 ... ]) VALUES (value1 [, value2, value3 ... ])Antallet af kolonner skal være det samme som antallet af værdier. Hvis en kolonne ikke er specificeret, tildeles den sin standardværdi. Indsatte værdier skal respektere alle begrænsninger såsom fremmede nøgler , primære nøgler og kolonner IKKE NULL . Hvis kommandoen indeholder en syntaksfejl, eller hvis en begrænsning ikke overholdes, indsættes værdierne ikke, og der rapporteres en fejl.
Eksempel:
INSERT INTO film_cast (firstname, lastname) VALUES ('Raoul', 'Duke')Der findes en mere kortfattet skrivning uden at navngive kolonnerne og indsætte værdierne i samme rækkefølge som kolonnerne i tabellen. Det er ikke nødvendigt at specificere alle kolonnerne, de resterende kolonner tager deres standardværdier.
Syntaks:
INSERT INTO table VALUES (value1, [value2, ... ])Det forrige eksempel kan derfor omskrives, hvis og kun hvis de to første kolonner i film_cast- tabellen er fornavn og efternavn :
INSERT INTO film_cast VALUES ('Raoul', 'Duke');Da SQL-92 er det muligt at indsætte flere tupler i en enkelt forespørgsel:
INSERT INTO table (column-a, [column-b, ...]) VALUES ('value-1a', ['value-1b', ...]), ('value-2a', ['value-2b', ...]), ...Denne funktion understøttes af DB2 , SQL Server (siden version 10.0), PostgreSQL (siden version 8.2), MySQL , SQLite (siden version 3.7.11) og H2 .
Eksempel (i betragtning af at 'fornavn' og 'efternavn' er de eneste to kolonner i 'film_cast' -tabellen):
INSERT INTO film_cast VALUES ('Raoul', 'Duke'), ('Dr.', 'Gonzo')De mange indsatser er særligt interessante med hensyn til ydeevne. Det tilrådes derfor, at en applikation, der skal indsætte mange linjer pr. Sekund, bruger flere anmodninger til at reducere antallet af anmodninger og belastningen på serveren. Brug af flere forespørgsler giver dig mulighed for at indsætte flere tupler end en række enkeltindsættelser i et givet tidspunkt.
For at indsætte flere tupler ved hjælp af MS SQL kan følgende konstruktion bruges:
INSERT INTO film_cast SELECT 'Raoul', 'Duke' UNION ALL SELECT 'Dr.', 'Gonzo'Dette er dog ikke en gyldig SQL-forespørgsel i henhold til SQL: 2003- standarden på grund af den ufuldstændige SELECT-underforespørgsel.
Det er også muligt at gøre dette i Oracle ved hjælp af DUAL-tabellen :
INSERT INTO film_cast SELECT 'Raoul', 'Duke' FROM DUAL UNION ALL SELECT 'Dr.','Gonzo' FROM DUALEn implementering, der respekterer SQL-standarder:
INSERT INTO film_cast SELECT 'Raoul', 'Duke' FROM LATERAL ( VALUES (1) ) AS t(c) UNION ALL SELECT 'Dr.','Gonzo' FROM LATERAL ( VALUES (1) ) AS t(c)Oracle PL / SQL understøtter syntaks "INSERT ALL", hvor flere indsætningsforespørgsler afsluttes med en SELECT:
INSERT ALL INTO film_cast VALUES ('Raoul', 'Duke') INTO film_cast VALUES ('Dr.', 'Gonzo') SELECT * FROM DUALMed Firebird- databasen er det muligt at indsætte flere gange takket være syntaksen:
INSERT INTO film_cast ("firstname", "lastname") SELECT 'Raoul', 'Duke' FROM RDB$DATABASE UNION ALL SELECT 'Dr.', 'Gonzo' FROM RDB$DATABASEFirebird begrænser dog antallet af tupler, der kan indsættes ved denne syntaks på grund af grænsen for antallet af sammenhænge, der kan bruges i en enkelt anmodning.
En enkelt INSERT-forespørgsel kan også bruges til at hente data fra en anden tabel, ændre dem om nødvendigt og derefter indsætte dem direkte i en tabel. I dette tilfælde bruges en underforespørgsel i stedet for VALUES-klausulen:
INSERT INTO film_cast2 ( firstname, lastname ) SELECT firstname, lastname FROM film_cast WHERE firstname IN ('Raoul', 'Dr.')Det er ofte nødvendigt at hente den kunstige primære nøgle, der blev automatisk genereret af databasemotoren under en indsættelse for at kunne bruge den i efterfølgende forespørgsler. Der er, afhængigt af den anvendte motor, forskellige metoder til at opnå det:
Firebird bruger den samme syntaks, men anmodningen kan kun indsætte en tuple.
INSERT INTO film_cast VALUES ('Raoul', 'Duke') RETURNING film_cast_idHvis udløsere (udløsere på engelsk) er defineret i den tabel, hvor anmodningen passer, udføres de i forbindelse med forespørgslen. FØR INDSÆTNING tillader ændring af de værdier, der skal indsættes, EFTER INDSÆT kan ikke længere ændre data, men kan bruges til at igangsætte handlinger på andre tabeller.