Insert (SQL)SQL příkaz INSERT přidá do tabulky relační databáze nový záznam. Základní formaZákladní forma příkazu INSERT INTO <tabulka> [(<sloupec>[,...n])] VALUES (<hodnota>[,...n]);
INSERT INTO <tabulka> [(<sloupec>[,...n])] <SELECT prikaz>;
kde:
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 Příklady
Obsah tabulky telefonni_seznam před vložením nového záznamu
INSERT INTO telefonni_seznam (jmeno, cislo) VALUES ('John Doe', '555-1212');
Obsah tabulky telefonni_seznam po vložení nového záznamu
Pokud jsou zadány hodnoty všech sloupečků, můžeme použít zkrácenou verzi: INSERT INTO tabulka VALUES ('hodnota1', [''hodnota2, ...'']);
INSERT INTO telefonni_seznam VALUES ('John Doe', '555-1212', 'Pařížská 6','Aš');
Rozšířené formyVlož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');
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ěruPovolená 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:
INSERT IGNORE INTOSQL příkaz
INSERT … SET …
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 …Pomocí konstrukce INSERT INTO tabulka_a (sloupec1a, sloupec2a, …)
SELECT sloupec1b, sloupec2b, … FROM tabulka_b [WHERE …];
Vložení nového nebo úprava existujícího záznamuPro 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. MERGEAsi nejvíce používaný a podporovaný je příkaz Obdoby MERGEDá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
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 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 Např. u MySQL existuje funkce Další vlastnostiVýchozí hodnotyVě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í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á číslaRelač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í hodnotySpolu 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_IDNě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. |