INSERT

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání

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

Základní forma[editovat | editovat zdroj]

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[editovat | editovat zdroj]

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[editovat | editovat zdroj]

Vložení více záznamů[editovat | editovat zdroj]

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');

Většinou je v případě vložení více záznamů povoleno použít i kratší formu s vynechaným seznamem sloupců.

INSERT IGNORE INTO[editovat | editovat zdroj]

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 podporán v MySQL.

INSERT … SET …[editovat | editovat zdroj]

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 | editovat zdroj]

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ě toleratní – 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[editovat | editovat zdroj]

Pro 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 | editovat zdroj]

Asi nejvíce používaný a podporovaný je příkaz MERGE, který je standardem SQL od verze SQL-99.

Obdoby MERGE[editovat | editovat zdroj]

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:

…ON DUPLICATE KEY[editovat | editovat zdroj]

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[editovat | editovat zdroj]

Výchozí hodnoty[editovat | editovat zdroj]

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.

Povinné zadání[editovat | editovat zdroj]

Na ú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[editovat | editovat zdroj]

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[editovat | editovat zdroj]

Spolu s tabulkami mohou být vytvořeny její tzv. unikátní indexyde 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[editovat | editovat zdroj]

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.