Insert (SQL)
SQL příkaz INSERT přidá do tabulky relační databáze nový záznam.
Základní forma
editovatZá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
editovat- 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
editovatVložení více záznamů
editovatNě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');
Většinou je v případě vložení více záznamů povoleno použít i kratší formu s vynechaným seznamem sloupců.
Vložení výběru
editovatPovolená je i forma vložení záznamu (nebo záznamů) jejichž sloupce jsou vybrány poddotazem SELECT. Poddotaz může použít většinu klauzulí jako pro samostatný dotaz typu SELECT (např. výrazy místo jen názvů sloupců, klauzuli WHERE, klauzuli LIMIT, klauzuli JOIN, agregační funkce).
INSERT INTO telefonni_seznam (jmeno, cislo)
SELECT jmeno, cislo FROM telefonni_seznam_kopie WHERE cislo LIKE "555-%" LIMIT 3;
V této konstrukci:
- chybí klíčové slovo VALUES
- hodnoty nejsou v závorkách
- poddotaz SELECT může být uveden pouze jeden
- počet sloupců v části INSERT a SELECT musí být stejný
INSERT IGNORE INTO
editovat
SQL příkaz INSERT
s klíčovým slovem IGNORE
při pokusu o vložení řádku shodujícího se v primárním či unikátním klíči potlačí standardní chování databázového stroje (hození chybové hlášky a skončení jako celku), místo toho bude tuto chybu ignorovat a pokračovat dál. Má význam zejména v případě vkládání více záznamů – po skončení příkazu budou vloženy jen ty nekolidující řádky, ty kolidující—duplicitní vloženy nebudou.
INSERT IGNORE INTO
je podporován v MySQL.
INSERT … SET …
editovat
INSERT … SET …
je pouze jiná forma příkazu, u které nejsou seznamy názvů sloupců a jejich hodnot odděleny ale uvedeny ve dvojicích, podobně jako u příkazu UPDATE. Tento zápis podporují jen některé databázové stroje.
INSERT INTO telefonni_seznam SET jmeno='John Doe', cislo='555-1212';
Tato syntaxe je vhodnější u ručně psaných dotazů při vkládání do tabulek s větším množstvím sloupců. Díky tomu, že název sloupce a jeho hodnota jsou u sebe, uživatel nemusí při připisování či ubírání jednoho sloupce kontrolovat pořadí ve výčtu sloupců a hodnot. Na druhou stranu takto nelze vložit více záznamů za sebou.
INSERT … SELECT …
editovat
Pomocí konstrukce INSERT … SELECT …
lze vložit do tabulky výsledek výběru pomocí SELECT
. V užím slova smyslu lze klonovat existující záznamy téže tabulky, což je případ, pro který se tato konstrukce využívá asi nejčastěji; v obecnějším významu lze použít jakýkoli výběrový dotaz neomezený shodou tabulek (např. místo sloupců doplněný o výrazy vytvořené z nich nebo jen z konstant). Podmínkou pro úspěšnost dotazu je shoda počet sloupců; shodovat by se měly i jejich typy, jinak by došlo k nezamýšleném výsledkům (například při pokusu uložit řetězec do sloupce uchovávající čísla se vloží nula). Neúspěch nastane též při pokusu vložit duplicitní záznam podle unikátního či primárního klíče, při pokusu uložit NULL do sloupce označeného NOT NULL nebo je-li závažná chyba v některém z výrazů (např. špatný počet parametrů apod.).
INSERT INTO tabulka_a (sloupec1a, sloupec2a, …)
SELECT sloupec1b, sloupec2b, … FROM tabulka_b [WHERE …];
- Seznam sloupců za tabulkou, do které se vkládá, může být nespecifikovaný; v takovém případě se předpokládají všechny sloupce.
- Dodržuje se pořadí (první zdrojový sloupec se vkládá do prvního cílového, druhý do druhého, atd.).
- Sloupce cílové a zdrojové tabulky se musí shodovat v počtu.
- Měly by se shodovat i typy odpovídajících sloupců. Různé databázové systémy jsou ohledně toho různě tolerantní – například většinou lze číselný sloupec nebo datum do textového (uloží se jako číslo v textové podobě), při pokusu uložit text do čísla se buď uloží nula nebo se vyvolá varování či chyba, stejně jako při pokusu vložit neodpovídající hodnotu do specifického typu (geometrického, složeného).
Vložení nového nebo úprava existujícího záznamu
editovatPro vložení nového záznamu, pokud neexistuje, nebo úpravu takového záznamu, který již existuje, mají různé SŘBD v SQL různé formulace prostředků, jak to učinit.
MERGE
editovat
Asi nejvíce používaný a podporovaný je příkaz MERGE
, který je standardem SQL od verze SQL-99.
Obdoby MERGE
editovat
Dále jsou to méně standardní příkazy SQL, které vkládání či editaci existujícího/neexistujícího záznamu řeší s částečnou podporou v různých databázových systémech:
REPLACE INTO…
(např. MySQL, ProgreSQL)UPSERT
(např. Microsoft SQL Azure, MongoDB).INSERT OR REPLACE
(SQLite)UPDATE OR INSERT INTO
(Firebird)
…ON DUPLICATE KEY
editovat
ON DUPLICATE KEY
je volitelná klauzule příkazu INSERT
, která funguje jako obdoba MERGE
. Existuje např. v MySQL. Stejně jako u MERGE
je zde specifikováno chování pro vkládání (záznam neexistuje) tak pro editaci (záznam již existuje).
INSERT INTO hledane_vyrazy(id,vyraz,pocet_hledani) VALUES(178,"Britney Spears",1)
ON DUPLICATE KEY UPDATE pocet_hledani=pocet_hledani+1;
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.
Tato formulace sice patří mezi ty delší, na druhou stranu umožňuje (pod)příkazem UPDATE reagovat na existenci záznamu změnou jiných sloupců než které by bylo vloženy v případě neexistence záznamu. Na rozdíl od REPLACE INTO
, který specifikuje hodnoty sloupců pro oba případy existence či neexistence záznamu, je pomocí INSERT … ON DUPLICATE KEY UPDATE…
možno v případě existence záznamu s duplicitním primárním klíčem specifikovat hodnoty jen pro některé sloupce s tím, že ostatní zůstanou nezměněny.
Např. u MySQL existuje funkce VALUES
s parametrem názvu sloupce, která vrací hodnotu tohoto sloupce v momentu vkládání a dá se tedy opisně použít v klauzuli ON DUPLICATE KEY
místo opakování hodnoty (literálu) – je to vhodné v případech, že vkládaná hodnota je velmi dlouhá.
Další vlastnosti
editovatVýchozí hodnoty
editovatVětšina relačních databází u definice tabulkového pole umožňuje stanovit výchozí (implicitní, výchozí) 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.
Povinné zadání
editovatNa úrovni databáze (jejího SŘBD) lze vhodným nastavením vynutit povinné zadání vybraných sloupců při vkládáním nového záznamu – s tím, že pokud zadány nebudou, databázový engine nedovolí daný záznam vložit a místo toho hodí chybovou hlášku. Nastavení spočívá v kombinaci DEFAULT NULL a NOT NULL v atributech sloupce – jinými slovy: nechť výchozí hodnota je NULL, ale nechť není nedovoleno vložit řádek s hodnotou NULL u tohoto sloupce.
Automatická čísla
editovatRelač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
editovatSpolu 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
editovatNě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.
Jiný způsob, jak zjistit hodnotu primárního klíče právě vloženého řádku, je s použitím triggeru [BEFORE|AFTER] INSERT s odkazem na kvazi-sloupec NEW.id.