Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL Insert Command срещу T-SQL Синтаксис на заявка с примери

Разработчиците са студенти през целия живот. Получаването на нови знания възможно най-бързо е винаги наш концерт. Ако идвате от лагера на T-SQL, кой е по-бързият начин да научите MySQL? Често искате да сравнявате синтаксиса. Последния път научихте за създаването на таблица в MySQL. Днешната ни публикация ще ви отведе още една крачка напред. Ще вмъкнем записи с MySQL INSERT.

Колко лесно може да бъде? И двете платформи за бази данни използват SQL, но знаем, че и двата продукта имат своите малко допълнения към стандартния SQL синтаксис. MySQL INSERT не е изключение.

По този начин, ако ви е писнало да сравнявате препратки за MySQL и SQL Server, днес е вашият щастлив ден. Подготвих синтаксиса и направих сравнението вместо вас. Освен това ще имаме примери за проверка. И накрая, ще имаме още една безплатна измама.

Сега, преди да се потопим, можете също да получите БЕЗПЛАТЕН PDF лист за мами за тази статия, като попълните формуляра за включване по-долу.

[sendpulse-form id=”12097″]

Готов? Страхотно!

MySQL INSERT INTO Синтаксис на заявка (конструктори на стойности на таблица)

Но преди да се потопим в подробностите, нека изясним няколко неща:

  • Версията на MySQL, която използвам тук, е 8.0.23 с механизма за съхранение на InnoDB.
  • Версията на SQL Server е 2019 г.

Първо, нека се опитаме да вмъкнем един запис в таблица. Основният синтаксис е подобен на този за SQL Server. Това е обаче, ако не включите името на базата данни и схемата и не оградите имената на колоните с обратни точки.

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

Посочването на действителното местоположение на таблицата ще бъде малко по-различно. Както посочих в тази публикация, базата данни е синоним на схема в MySQL. Проверете модифицираната проба по-долу:

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

Забелязали ли сте липсата на името на схемата по-горе?

Междувременно клаузата VALUES по-горе формира конструктор на стойност на таблицата. По същия начин SQL Server също има тази функция.

Вмъкване на няколко реда в таблици в MySQL

Нека опитаме да вмъкнем няколко реда.

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

Горният код ще вмъкне два записа с помощта на два конструктора на стойности на таблица. Можете също да използвате изрази вместо литерални стойности. Примерът по-долу използва подзаявка за всяка колона:

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

Подзаявките изглеждат излишни в заявката по-горе. Но това ще генерира грешка:

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!

Конструкторът на стойност на таблицата очаква литерал или израз за всяко поле в списъка с колони. Освен това подзаявките в предишния пример връщат един ред с една стойност и това е валидно. Въпреки това, операторът SELECT по-горе ще предизвика грешка, защото връща множество редове и колони.

Друга възможност е да посочите ключовата дума ROW, както е в примера по-долу:

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

Но ключовата дума ROW в израза INSERT не се поддържа в SQL Server.

MySQL INSERT INTO с SELECT от друга таблица

Можете да добавяте записи в таблица с помощта на оператора SELECT:

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

Както можете да видите, същото е и с T-SQL без името на базата данни, името на схемата и символа за обратна отметка. Рангът е запазена дума, между другото.

Следователно знаците за обратна отметка, обхващащи думата Ранг, са задължителни.

Можете да го изразите без списъка с колони. Просто посочете имената на колоните в същата последователност като подредбата на колоните на целевата таблица.

TRUNCATE TABLE testdatabase.people2;

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

SELECT * FROM testdatabase.people2

Вижте изхода по-долу от dbForge Studio за MySQL:

Звучи добре? Нека разширим повече по темата за обработката на стойности на колони.

INSERT и Стойности на колони таблици

Този раздел ще се задълбочи в стойностите на колоните, когато използвате MySQL INSERT. Има четири от тях:

  • Стойности на Unicode.
  • Стойности по подразбиране.
  • Използване на автоматично увеличение.
  • Стойности от дефинираните от потребителя променливи.

Вмъкване на Unicode низ

В T-SQL сте запознати с предхождането на низова стойност с N . Когато използва това, SQL Server приема, че стойността е Unicode стойност. В MySQL нямате нужда от това.

Вижте примера по-долу:

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

Има няколко точки, на които трябва да обърнете внимание:

  1. Използването на NVARCHAR при създаване на таблица в MySQL 8 ще бъде автоматично променено на VARCHAR.
  2. Не е необходимо стойността на Unicode да се предхожда с N , като N’김지수’.
  3. Трябва да редактирате малко горния код, за да работи успешно в SQL Server.

Проверете резултата по-долу:

Ето еквивалентния код в 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

Опитайте да премахнете „N“ от една от стойностите на Unicode по-горе. Кодът ще работи добре, но вие проверявате изхода по-долу в SQL Server Management Studio:

Как да вмъкна стойност по подразбиране в MySQL

Стойностите по подразбиране на колоната действат, когато вмъкнете запис, без да посочите стойност. Използвахме това в първия пример по-горе. Ето отново дефиницията на колоната:


`ModifiedDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP()

Колоната ModifiedDate по подразбиране на текущата дата и час на сървъра. Ето защо, когато направихме това:

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

Резултатът е следният:

Много спретнат и спестяващ натискане на клавиши. Същото поведение се случва и в SQL Server.

Междувременно, ако искате да го направите изрично, просто посочете името на колоната със стойност DEFAULT:

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

Работи и в SQL Server с лека модификация.

Има и друг инструмент за запазване на време и натискане на клавиши. Има стойност на колона с автоматично увеличение.

ВМЕСЕТЕ в AUTO_INCREMENT колона

Вместо да получавате последната стойност на цяло число в таблица и да добавяте 1, по-добре е да дефинирате колона с автоматично увеличение. добър е за първични ключове. Направихме това в примера за таблица с Unicode.

Ето отново част от него:

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

Междувременно в SQL Server използваме ключовата дума IDENTITY вместо AUTO_INCREMENT.

Фигура 2 разкрива резултата от дефинирането на колона с автоинкремент. Целочислените стойности са генерирани, без да се посочва в оператора INSERT.

Използване на потребителски дефинирани променливи за задаване на стойности на колони

Друг често срещан случай за вмъкване на записи в T-SQL е прилагането на потребителски дефинирани променливи за задаване на стойности на колони. Полезно е за създаване на ad-hoc скриптове и съхранени процедури.

Но първо, дефинирането на променливи в MySQL може да се извърши с помощта на SET. За разлика от SQL Server, вие използвате DECLARE. Разгледайте примера:

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

Както можете да видите по-горе, променливите действат като изрази за попълване на стойностите на колоните в клаузата VALUES.

Вмъкване във временна таблица в MySQL

Тук разглеждаме използването на MySQL INSERT във временни таблици. T-SQL разработчиците са запознати с „# Символ „предхождащ име на временна таблица. В MySQL временните таблици се създават с помощта на CREATE TEMPORARY TABLE име_на_таблица . Той няма „# ‘ символ. Следователно, сред редовете на вашия скрипт, име на временна таблица може да изглежда същото като обикновените имена на таблица:

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;

С други думи, вмъкването на записи във временни таблици изглежда по същия начин като обикновените таблици.

Ето резултата:

MySQL INSERT… ПРИ АКТУАЛИЗИРАНЕ НА ДУБЛИКАТ КЛЮЧ – Неподдържан синтаксис в T-SQL

И накрая, MySQL INSERT има случаи на синтаксис, които не се поддържат в T-SQL. Един от тях е INSERT...ON DUPLICATE KEY UPDATE. Какво може да направи?

Когато дадена таблица има уникален ключ и ви се случи да вмъкнете стойност, която ще причини дубликат, INSERT ще се провали. Въпреки това, когато използвате INSERT...ON DUPLICATE KEY UPDATE, вместо това ще се появи актуализация на съществуващия ред. Грешката няма да възникне.

Да кажем, че имаме тези записи в хора таблица:

Забележете стойността на корабния регистър, поставена в червено, и целия този ред. Работата е там, че ще вмъкнем същия запис с ПРИ АКТУАЛИЗИРАНЕ НА ДУБЛИКАТ КЛЮЧ.

Сега нека задействаме изявлението по-долу:

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;

Има ли грешка? Нека го проверим!

Страхотно, нали?

Същият ефект се получава, когато направите това:

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

Междувременно можете да изразите намерението в T-SQL по следния начин:

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

Ще се получи същият резултат.

Заключение

Бенджамин Франклин веднъж каза:„Инвестицията в знания винаги носи най-добрата лихва. Надявам се тази статия да ви се отплати с времето.

Нека направим обобщение:

  1. Основният синтаксис на MySQL INSERT е почти същият в T-SQL, с изключение на отсъствието на името на схемата и използването на обратни отметки.
  2. Вмъкването на записи в MySQL от друга таблица е почти същото като в T-SQL.
  3. Стойностите на колоните се обработват по различен начин в MySQL INSERT. Unicode стойностите са най-забележимите. Освен това синтаксисът е различен при използването на AUTO_INCREMENT.
  4. Вмъкването на записи във временна таблица в MySQL има малка разлика в T-SQL с „# символ „.
  5. INSERT...ON DUPLICATE KEY UPDATE изглежда добре при съкращаване на синтаксиса, за да се избегнат дублиращи се грешки.

Надявам се статията да ви е била полезна, докато изучавате MySQL. Ако ви харесва тази публикация, моля, споделете я в любимите си социални медийни платформи!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Производителност на MySQL – 5 параметъра от конфигурационния файл

  2. Пишете с главни букви първата буква на всяка дума в съществуващата таблица

  3. Как да премахнете крайния празен интервал в MySQL

  4. Как да деактивирате проверката на чужд ключ в MySQL

  5. Присъединяване спрямо подзаявка