Přeskočit na obsah

Insert (SQL)

Z Wikipedie, otevřené encyklopedie

SQL příkaz INSERT přidá do tabulky relační databáze nový záznam.

Základní forma

Základní forma příkazu INSERT vypadá takto:

 
INSERT INTO <tabulka> [(<sloupec>[,...n])] VALUES (<hodnota>[,...n])
 
INSERT INTO <tabulka> [(<sloupec>[,...n])] <SELECT prikaz>

kde:

  • <tabulka> je název tabulky, do které se má nový záznam uložit.
  • <sloupec> je jmenovitý seznam sloupců, do kterých se hodnoty ukládají.
  • <hodnota> je vkládaná hodnota. Každá hodnota se uloží do sloupce, jež má stejnou pozici ve výčtu sloupců jako tato hodnota.
  • <SELECT prikaz> je poddotaz pro výběr záznamů z tabulky (SELECT). V této syntaxi se do tabulky vloží výsledek tohoto výběru.

Seznam sloupců v závorkách může být vynechán; v tom případě se předpokládá seznam všech sloupců tabulky. Počet sloupců a hodnot musí být stejný. U sloupců vynechaných v daném seznamu se použije implicitní hodnota. Tu obsahuje definice dané tabulky.

Hodnoty zadané při INSERT dotazu musí splňovat všechny podmínky pro sloupce (např. primární klíč, podmínky CHECK a NOT NULL). Pokud nejsou splněny nebo nastane syntaktická chyba, záznam se do tabulky nevloží a databázový stroj (záleží na jeho typu) pošle chybový kód a hlášku.

Příklady

Příklad 1

Obsah tabulky telefonni_seznam před vložením nového záznamu

jmeno cislo ulice mesto
Jan Novák 257125474 Wikipedistická 28 Pastoriovice
Jana Nováková 574125474 Luční 6 Praha
 
INSERT INTO telefonni_seznam (jmeno, cislo) VALUES ('John Doe', '555-1212');

Obsah tabulky telefonni_seznam po vložení nového záznamu

jmeno cislo ulice mesto
Jan Novák 257125474 Wikipedistická 28 Pastoriovice
Jana Nováková 574125474 Luční 6 Praha
John Doe 555-1212 NULL NULL

Pokud jsou zadány hodnoty všech sloupečků, můžeme použít zkrácenou verzi:

 
INSERT INTO ''tabulka'' VALUES (''hodnota1'', [''hodnota2, ...''])
Příklad 2
 
INSERT INTO telefonni_seznam VALUES ('John Doe', '555-1212', 'Pařížská 6','Aš');
jmeno cislo ulice mesto
Jan Novák 257125474 Wikipedistická 28 Pastoriovice
Jana Nováková 574125474 Luční 6 Praha
John Doe 555-1212 Pařížská 6

Rozšířené formy

Vložení více záznamů

Některé databáze povolují vložení více záznamů za sebou. V takovém případě se hodnoty pro druhý, třetí… další záznam vloží za ty první a oddělí čárkou.

 
INSERT INTO telefonni_seznam (jmeno, cislo) VALUES 
('John Doe', '555-1212'), 
('Leona Lewis', '555-112777'), 
('Joe King', '555-1213');

REPLACE INTO

Některé databáze (MySQL, ProgreSQL, …) mají SQL příkaz, který příkaz INSERT kombinuje s příkazem DELETE – tedy: pokud záznam existuje (tj. shoduje v primárním klíči), pak jej smaže a následně provede vložení ve stylu INSERT INTO….

REPLACE INTO není zahrnuto ve standardech SQL-92 nebo SQL-99, je na něj nahlíženo jako na „bonus“, s kterým se při případné migraci na jinou databázi nemusí nutně počítat.

…ON DUPLICATE KEY

ON DUPLICATE KEY je část syntaktické konstrukce, která může následovat za příkazem INSERT. V takovém případě umožňuje zareagovat na případ, kdy záznam (dané hodnoty primárního klíče) v tabulce již existuje. Pokud je za ON DUPLICATE KEY např. příkaz pro úpravu tohoto existujícího záznamu (UPDATE), lze tímto složeným příkazem substituovat dva SQL příkazy.

INSERT INTO hledane_vyrazy(id,vyraz,pocet_hledani) VALUES(178,"Britney Spears",1)
ON DUPLICATE KEY UPDATE hledane_vyrazy SET pocet_hledani=pocet_hledani+1 WHERE id=178;

Alternativou k tomu by byly buď dva SQL příkazy nebo zapojení správy chyb, které ne každý databázový stroj podporuje. Konstrukce ON DUPLICATE KEY je naproti tomu součástí standardu SQL-99.

Na rozdíl od REPLACE INTO je pomocí INSERT … ON DUPLICATE KEY UPDATE… možno v případě existence záznamu s duplicitním primárním klíčem měnit jen některé sloupce s tím, že ostatní zůstanou nezměněny. V případě REPLACE INTO se existující řádek maže celý a hodnoty ostatních sloupců nejsou zachovány.

Další vlastnosti

Výchozí hodnoty

Většina relačních databází u definice tabulkového pole umožňuje stanovit výchozí (implicitní, defaultní) hodnotu. Pokud při vkládání dané políčko nespecifikujeme, vloží se do něj automaticky tato implicitní hodnota. Stejný efekt bude mít, pokud jako hodnotu použijeme klíčové slovo DEFAULT, které výchozí hodnotu pro daný sloupec reprezentuje.

Automatická čísla

Relační databáze taktéž povolují vytvoření primárního indexu (primárního klíče) tabulky, jehož hodnota je určována nezávisle na explicitně vložené hodnotě (např. v MS Access, MSSQL se jedná o speciální typ automatické číslo a při vložení nového záznamu se toto pole musí vynechat, v MySQL má pole příznak AUTO_INCREMENT a při vložení se místo něj může specifikovat např. prázdný řetězec nebo DEFAULT).

Duplicitní hodnoty

Spolu s tabulkami mohou být vytvořeny její tzv. unikátní indexy – de facto mechanismus, který vyloučí, aby pro určité pole v tabulce existovaly duplicitní hodnoty (tím, že v případě pokusu o vložení takového záznamu databázový stroj ohlásí chybu).

LAST_INSERT_ID

Některé databáze jako Oracle, MySQL, PostgreSQL definují speciální hodnotu LAST_INSERT_ID, která reprezentuje hodnotu primárního klíče (nejčastěji nazývaného ID – odtud název) naposledy vloženého záznamu. Pokud je třeba nově vytvořený záznam vzápětí upravit (nebo provést jiné změny týkající se tohoto záznamu), lze tuto hodnotu použít. LAST_INSERT_ID není zahrnuta ve standardu SQL'92.