sql >> Databáze >  >> RDS >> Mysql

Příkaz MySQL Insert vs syntaxe dotazu T-SQL s příklady

Vývojáři jsou celoživotní studenti. Získávání nových znalostí tak rychle, jak jen můžeme, je vždy naším vystoupením. Pokud pocházíte z tábora T-SQL, jaký je rychlejší způsob, jak se naučit MySQL? Často chcete porovnat syntaxe. Minule jste se dozvěděli o vytváření tabulky v MySQL. Náš dnešní příspěvek vás posune o krok dále. Záznamy vložíme pomocí MySQL INSERT.

Jak snadné to může být? Obě databázové platformy používají SQL, ale víme, že oba tyto databázové produkty mají několik dodatků ke standardní syntaxi SQL. MySQL INSERT není výjimkou.

Pokud vás tedy nebaví porovnávat reference pro MySQL a SQL Server, dnes je váš šťastný den. Připravil jsem syntaxi a provedl jsem pro vás srovnání. Také budeme mít příklady, které si můžete prohlédnout. Konečně budeme mít další bezplatný cheat sheet.

Nyní, než se ponoříme do toho, můžete také získat ZDARMA cheat ve formátu PDF k tomuto článku vyplněním přihlašovacího formuláře níže.

[sendpulse-form id=”12097″]

připraveni? Skvělé!

MySQL INSERT INTO syntaxe dotazu (konstruktory hodnot tabulky)

Než se však ponoříme do podrobností, ujasněme si několik věcí:

  • Verze MySQL, kterou zde používám, je 8.0.23 s úložištěm InnoDB.
  • Verze serveru SQL Server je 2019.

Nejprve zkusme vložit jeden záznam do tabulky. Základní syntaxe je podobná syntaxi pro SQL Server. Je tomu tak však v případě, že neuvedete název databáze a schématu a neuzavřete názvy sloupců zpětným zaškrtnutím.

CREATE TABLE testdatabase.people
(`ID` int NOT NULL PRIMARY KEY,
 `Lastname` varchar(50) NOT NULL,
 `FirstName` varchar(50) NOT NULL,
 `MiddleName` varchar(50) NULL DEFAULT '',
 `Rank` varchar(20) NOT NULL,
 `Ship` varchar(50) NOT NULL,
 `ShipRegistry` varchar(20) NOT NULL,
 `ModifiedDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP());
  
INSERT INTO people
(`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`)
VALUES (3,'Archer','Jonathan','','Captain','Enterprise','NX-01');

Zadání skutečného umístění tabulky se bude mírně lišit. Jak jsem uvedl v tomto příspěvku, databáze je synonymem pro schéma v MySQL. Zkontrolujte upravenou ukázku níže:

INSERT INTO testdatabase.people
(`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`)
VALUES (3,'Archer','Jonathan','','Captain','Enterprise','NX-01');

Všimli jste si absence názvu schématu výše?

Mezitím výše uvedená klauzule VALUES tvoří konstruktor hodnot tabulky. Podobně má tuto funkci i SQL Server.

Vložit více řádků do tabulek v MySQL

Zkusme vložit více řádků.

INSERT INTO testdatabase.people
(ID, LastName, FirstName, MiddleName, Rank, Ship, ShipRegistry)
VALUES (4,'Janeway','Kathryn','', Captain','USS Voyager', 'NCC-74656'), 
       (5, 'Sisko','Benjamin','','Captain','USS Defiant','NX-74205');

Výše uvedený kód vloží dva záznamy pomocí dvou konstruktorů hodnot tabulky. Místo doslovných hodnot můžete také použít výrazy. Níže uvedený příklad používá poddotaz pro každý sloupec:

CREATE TABLE testdatabase.people2 LIKE people;

INSERT INTO testdatabase.people2
(`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`)
VALUES (4,'Janeway','Kathryn','','Captain','USS Voyager', 'NCC-74656'), 
       (5, (SELECT Lastname FROM people WHERE ID=5), 
           (SELECT Firstname FROM people WHERE ID=5), 
           (SELECT MiddleName FROM people WHERE ID=5),
           (SELECT `Rank` FROM people WHERE ID=5),
           (SELECT Ship FROM people WHERE ID=5),
           (SELECT ShipRegistry FROM people WHERE ID=5));

Poddotazy vypadají ve výše uvedeném dotazu nadbytečné. To však vygeneruje chybu:

INSERT INTO testdatabase.people2
(`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`)
VALUES (4,'Janeway','Kathryn','','Captain','USS Voyager', 'NCC-74656'), 
       (SELECT `ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, 
        `Ship`, `ShipRegistry` FROM people);    -- ERROR!

Konstruktor hodnot tabulky očekává literál nebo výraz pro každé pole v seznamu sloupců. Navíc poddotazy v předchozím příkladu vracejí jeden řádek s jednou hodnotou, a to je platné. Výše uvedený příkaz SELECT však spustí chybu, protože vrátí více řádků a sloupců.

Další možností je zadat klíčové slovo ROW jako v příkladu níže:

INSERT INTO testdatabase.people
(ID, LastName, FirstName, MiddleName, Rank, Ship, ShipRegistry)
VALUES ROW(4,'Janeway','Kathryn','', Captain','USS Voyager', 'NCC-74656'), 
       ROW(5, 'Sisko','Benjamin','','Captain','USS Defiant','NX-74205');

Ale klíčové slovo ROW v příkazu INSERT není na serveru SQL podporováno.

MySQL INSERT INTO s SELECT z jiné tabulky

Záznamy do tabulky můžete přidat pomocí příkazu SELECT:

INSERT INTO people2
(ID, Lastname, FirstName, MiddleName, `Rank`, Ship, ShipRegistry)
SELECT ID, Lastname, FirstName, MiddleName, `Rank`, Ship, ShipRegistry FROM people;

Jak vidíte, je to stejné s T-SQL bez názvu databáze, názvu schématu a znaku backtick. Hodnost je mimochodem vyhrazené slovo.

Znaky zadního zaškrtnutí obklopující slovo Rank jsou tedy nutností.

Můžete to vyjádřit bez seznamu sloupců. Jednoduše zadejte názvy sloupců ve stejném pořadí, jako je uspořádání sloupců cílové tabulky.

TRUNCATE TABLE testdatabase.people2;

INSERT INTO testdatabase.people2
SELECT ID, Lastname, FirstName, MiddleName, `Rank`, Ship, ShipRegistry, ModifiedDate 
FROM people;

SELECT * FROM testdatabase.people2

Viz výstup níže z dbForge Studio pro MySQL:

To zní dobře? Pojďme se více rozvést na téma zpracování hodnot sloupců.

VLOŽTE hodnoty sloupců a tabulky

Tato část se ponoří hlouběji do hodnot sloupců při použití INSERT MySQL. Jsou čtyři:

  • Hodnoty Unicode.
  • Výchozí hodnoty.
  • Pomocí automatického zvýšení.
  • Hodnoty z uživatelsky definovaných proměnných.

Vložte řetězec Unicode

V T-SQL jste obeznámeni s předřazením hodnoty řetězce pomocí N . Při použití toho SQL Server předpokládá, že hodnota je hodnota Unicode. V MySQL to nepotřebujete.

Podívejte se na příklad níže:

CREATE TABLE IF NOT EXISTS UnicodeNames
(ID int NOT NULL PRIMARY KEY AUTO_INCREMENT,
 FullName varchar(50) NOT NULL);

INSERT INTO UnicodeNames
(FullName)
VALUES ('김지수'),('김제니'),('박채영'),('ลลิษา มโนบาล');

SELECT * FROM UnicodeNames

Je třeba vzít na vědomí několik bodů:

  1. Použití NVARCHAR při vytváření tabulky v MySQL 8 se automaticky změní na VARCHAR.
  2. Hodnotu Unicode není třeba uvádět N , jako N’김지수’.
  3. Musíte trochu upravit výše uvedený kód, aby úspěšně fungoval na serveru SQL.

Zkontrolujte výsledek níže:

Zde je ekvivalentní kód v T-SQL:

CREATE TABLE UnicodeNames
(ID int NOT NULL IDENTITY PRIMARY KEY,
 FullName nvarchar(50) NOT NULL);

INSERT INTO UnicodeNames
(FullName)
VALUES (N'김지수'),(N'김제니'),(N'박채영'),(N'ลลิษา มโนบาล');

SELECT * FROM UnicodeNames

Zkuste odstranit „N“ z jedné z výše uvedených hodnot Unicode. Kód poběží dobře, ale zkontrolujte výstup níže v SQL Server Management Studio:

Jak vložit výchozí hodnotu do MySQL

Výchozí hodnoty sloupce fungují, když vložíte záznam bez zadání hodnoty. To jsme použili v prvním příkladu výše. Zde je opět definice sloupce:


`ModifiedDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP()

Sloupec Datum změny výchozí je aktuální datum a čas na serveru. Proto když jsme to udělali:

INSERT INTO testdatabase.people
(`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`)
VALUES (3,'Archer','Jonathan','','Captain','Enterprise','NX-01');

Výsledek je tento:

Velmi elegantní a šetřící stisk kláves. Ke stejnému chování dochází také v SQL Server.

Mezitím, pokud chcete, aby to bylo explicitní, stačí zadat název sloupce s hodnotou DEFAULT:

INSERT INTO testdatabase.people
(`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`, `ModifiedDate`)
VALUES (6, 'Pyke','Christopher','','Captain','USS Enterprise','NCC 1701', DEFAULT);

Funguje také v SQL Server s mírnou úpravou.

Existuje další spořič času a úhozů. Má hodnotu sloupce automatického přírůstku.

VLOŽIT do Sloupec AUTO_INCREMENT

Místo získání poslední celočíselné hodnoty v tabulce a přidání 1 je lepší definovat sloupec automatického přírůstku. je to dobré pro primární klíče. Udělali jsme to v příkladu tabulky Unicode.

Zde je část z toho znovu:

CREATE TABLE IF NOT EXISTS UnicodeNames
(ID int NOT NULL PRIMARY KEY AUTO_INCREMENT,
 FullName varchar(50) NOT NULL);

Mezitím v SQL Server používáme klíčové slovo IDENTITY namísto AUTO_INCREMENT.

Obrázek 2 ukazuje výsledek definování sloupce automatického přírůstku. Celočíselné hodnoty byly vygenerovány bez uvedení v příkazu INSERT.

Použití uživatelsky definovaných proměnných k nastavení hodnot sloupců

Dalším běžným případem pro vkládání záznamů v T-SQL je použití uživatelem definovaných proměnných pro nastavení hodnot sloupců. Je to užitečné pro vytváření ad-hoc skriptů a uložených procedur.

Nejprve je však možné definovat proměnné v MySQL pomocí SET. Na rozdíl od SQL Serveru používáte DECLARE. Podívejte se na příklad:

SET @stringValue = 'string value';
SET @numericValue = 1287;
SET @booleanValue = TRUE;
SET @dateValue = CURRENT_DATE();

CREATE TABLE IF NOT EXISTS TableDataTypeValues
(ID int NOT NULL PRIMARY KEY AUTO_INCREMENT,
 stringValue varchar(50) NOT NULL,
 numericValue int NOT NULL,
 BooleanValue bit not NULL DEFAULT FALSE,
 dateValue date NULL);

INSERT INTO TableDataTypeValues
(stringValue, numericValue, BooleanValue, dateValue)
VALUES (@stringValue, @numericValue, @booleanValue, @dateValue);

Jak můžete vidět výše, proměnné fungují jako výrazy k vyplnění hodnot sloupců v klauzuli VALUES.

Vložit do dočasné tabulky v MySQL

Zde se podíváme na použití MySQL INSERT v dočasných tabulkách. Vývojáři T-SQL jsou obeznámeni s „# “ symbol před názvem dočasné tabulky. V MySQL se dočasné tabulky vytvářejí pomocí CREATE TEMPORARY TABLE table_name . Nemá „# ‘symbol. Mezi řádky vašeho skriptu tedy může dočasné jméno tabulky vypadat stejně jako běžné názvy tabulek:

CREATE TEMPORARY TABLE tmpkpopgroup
(ID int NOT NULL PRIMARY KEY AUTO_INCREMENT,
 GroupName varchar(50) NOT NULL,
 ModifiedDate datetime DEFAULT CURRENT_TIMESTAMP());

INSERT INTO tmpkpopgroup
(GroupName)
VALUES ('BTS'),('SEVENTEEN'),('TWICE'),('MOMOLAND'),('GIRLS GENERATION'),('BLACKPINK'),('OH MY GIRL'),('RED VELVET');

SELECT * FROM tmpkpopgroup
ORDER BY GroupName;

Jinými slovy, vkládání záznamů do dočasných tabulek vypadá stejně jako běžné tabulky.

Zde je výsledek:

VLOŽENÍ MySQL… PŘI AKTUALIZACI DUPLIKÁTNÍHO KLÍČE – Nepodporovaná syntaxe v T-SQL

A konečně, MySQL INSERT obsahuje případy syntaxe, které nejsou v T-SQL podporovány. Jedním z nich je INSERT…ON DUPLICATE KEY UPDATE. Co to umí?

Pokud má tabulka jedinečný klíč a náhodou vložíte hodnotu, která způsobí duplikaci, INSERT se nezdaří. Pokud však použijete INSERT…ON DUPLICATE KEY UPDATE, dojde místo toho k aktualizaci existujícího řádku. K chybě nedojde.

Řekněme, že máme tyto záznamy v lidech tabulka:

Všimněte si hodnoty lodního registru v červeném rámečku a celého řádku. Jde o to, že vložíme stejný záznam pomocí ON DUPLICATE KEY UPDATE.

Nyní spustíme následující prohlášení:

INSERT INTO testdatabase.people
(`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`, `ModifiedDate`)
VALUES (5, 'Sisko','Benjamin','','Captain','USS Defiant','NCC-75633', DEFAULT)
ON DUPLICATE KEY UPDATE ShipRegistry = 'NCC-75633';

SELECT * FROM testdatabase.people;

je tam chyba? Pojďme to zkontrolovat!

Skvělé, že?

Stejný efekt nastane, když to uděláte:

UPDATE people 
SET ShipRegistry = 'NCC-75633'
WHERE ID = 5

Mezitím můžete vyjádřit záměr v T-SQL takto:

IF EXISTS(SELECT id FROM people WHERE id = 5)
	UPDATE people 
	SET ShipRegistry = 'NCC-75633'
	WHERE ID = 5
ELSE
	INSERT INTO people
	(ID, LastName, FirstName, MiddleName, [Rank], Ship, ShipRegistry, ModifiedDate)
	VALUES (5, 'Sisko','Benjamin','','Captain','USS Defiant','NCC-75633', DEFAULT);

Dojde ke stejnému výsledku.

Závěr

Benjamin Franklin jednou řekl:„Investice do znalostí se vždy vyplatí nejlépe.“ Doufám, že se vám tento článek časem vyplatí.

Udělejme si rekapitulaci:

  1. Základní syntaxe MySQL INSERT je v T-SQL téměř stejná, s výjimkou nepřítomnosti názvu schématu a použití zpětných značek.
  2. Vkládání záznamů do MySQL z jiné tabulky je téměř stejné jako v T-SQL.
  3. Hodnoty sloupců jsou v MySQL INSERT zpracovány odlišně. Hodnoty Unicode jsou nejpozoruhodnější. Také syntaxe se liší v použití AUTO_INCREMENT.
  4. Vkládání záznamů do dočasné tabulky v MySQL má menší rozdíl oproti T-SQL s „# symbol ‘.
  5. VLOŽTE… PŘI AKTUALIZACI DUPLIKÁTNÍHO KLÍČE vypadá dobře na zkrácení syntaxe, aby se předešlo duplicitním chybám.

Doufám, že se vám článek ukázal jako užitečný, když se učíte MySQL. Pokud se vám tento příspěvek líbí, sdílejte jej na svých oblíbených platformách sociálních médií!


  1. EM 12c Úprava prahových hodnot

  2. chyba běhu:java.lang.ClassNotFoundException:com.mysql.jdbc.Driver

  3. Objekt 'DF__*' je závislý na sloupci '*' - Změna int na double

  4. K-Nearest Neighbor Query v PostGIS