Insert (SQL)
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>
- <tabulka> - Název tabulky, do které se má nový záznam uložit.
- <sloupec> - Jmenovitý seznam sloupců, do kterých se hodnoty ukládají.
- <hodnota> - Vkládaná hodnota. Každá hodnota se uloží do sloupce jež má stejnou pozici ve výčtu sloupců jako tato hodnota.
- <SELECT prikaz> - Vytvoří sadu výsledků která bude vložena do uvedené tabulky.
Počet sloupců a hodnot musí být stejný. Pokud není sloupeček zadán (tzn. že jméno sloupce není uvedeno v seznamu sloupců), použije se implicitní hodnota. Tato implicitní hodnota se definuje společně s definicí 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 nastane syntaktická chyba, záznam se do tabulky nepřidá.
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 | Aš |
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ý kombinuje příkazy INSERT a UPDATE – tedy: pokud záznam existuje, aktualizuje jeho data, a pokud ne, vloží jej jako kdyby byl volán prostý 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.
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.