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

ТОП 5 Синтаксис за изтриване на MySQL със съвети за T-SQL разработчици

Нашето пътуване до MySQL започна със CREATE TABLE, последвано от INSERT. Днес преминаваме към оператора DELETE на MySQL. Той е почти толкова често срещан, колкото изявлението UPDATE на MySQL.

Тъй като сте запознати с T-SQL DELETE, целта е да ви направи по-продуктивни с помощта на MySQL синтаксиса. Има малки разлики в тези изрази DELETE, но няма нищо, с което да не можете да се справите. Да започваме.

Подготовка на примерните данни

Една от най-често срещаните нужди е задачата за изтриване на ред MySQL. Ще го разгледаме тук, но първо трябва да подготвим работната си зона. За да изтрием записи, първо трябва да ги имаме. И така, нека изградим база данни в MySQL.

Изпитвам носталгия по телевизионни сериали от 80-те, така че ще използвам епизоди от MacGyver и Quantum Leap за примерни данни. Имам окончателния файл на Excel за импортиране на данните в нова база данни. Този файл има 2 листа с име Заглавия и Епизоди . Ще ги импортираме и двете в две таблици.

Преди да импортираме данни, трябва да създадем база данни с име TV-series с две таблици, наречениЗаглавия и Епизоди . Задачата за създаване на таблица в MySQL е елементарна с подходящия инструмент. Използвам dbForge Studio за MySQL и следващите фигури 1 и 2 показват структурата на визуалната таблица на моята база данни, представена от този инструмент.

Скриптът за таблиците е по-долу:

CREATE DATABASE IF NOT EXISTS `tv-series`;

USE `tv-series`;

CREATE TABLE `tv-series`.titles (
  TitleID int NOT NULL AUTO_INCREMENT,
  Title varchar(50) DEFAULT NULL,
  `From` int DEFAULT NULL,
  `To` int DEFAULT NULL,
  PRIMARY KEY (TitleID)
)
ENGINE = INNODB,
AUTO_INCREMENT = 3,
AVG_ROW_LENGTH = 8192,
CHARACTER SET utf8mb4,
COLLATE utf8mb4_0900_ai_ci;

CREATE TABLE `tv-series`.episodes (
  EpisodeID int NOT NULL AUTO_INCREMENT,
  TitleID int DEFAULT NULL,
  EpisodeTitle varchar(100) DEFAULT NULL,
  AirDate date DEFAULT NULL,
  Synopsis text DEFAULT NULL,
  EpisodeNo int NOT NULL,
  SeasonNo int NOT NULL,
  PRIMARY KEY (EpisodeID)
)
ENGINE = INNODB,
AUTO_INCREMENT = 160,
AVG_ROW_LENGTH = 414,
CHARACTER SET utf8mb4,
COLLATE utf8mb4_0900_ai_ci;

ALTER TABLE `tv-series`.episodes
ADD INDEX IDX_episodes_TitleID (TitleID);

След като създадем базата данни и таблиците, можем да импортираме нашите данни от файла на Excel.

Най-простият и мощен инструмент, който използвах за импортиране на Excel файлове в MySQL, е dbForge Studio за MySQL. Особено оценявам добавянето на нова колона като първичен ключ в целевата таблица. Освен това форматът за автоматично откриване на дата и час е страхотна поддръжка. Преобразува дати с текстов тип данни и странни формати за дата без проблеми.

Тъй като ще сравним синтаксиса на MySQL с T-SQL, можете също да импортирате файла на Excel в нова база данни на SQL Server. След това използвайте същите имена на база данни и таблици като в MySQL.

Повече информация

  • Инструмент за импортиране и експортиране на MySQL в dbForge Studio за MySQL

1. Изтриване на всички данни от таблица

Първо, най-лесният. Нека се опитаме да създадем резервно копие на Епизодите таблица и след това изтрийте записите на архива. Ще извършим стандартната MySQL операция за изтриване на всички редове, която може да се наложи да направите в различни ситуации.

CREATE TABLE episodes_backup AS
SELECT * FROM episodes;

DELETE FROM episodes_backup;

Както виждате, синтаксисът е същият като при T-SQL. Заявката ще изтрие всички записи в episodes_backup таблица.

Няколко бележки за вас:

  1. Ако трябва да изтриете няколко реда или всички редове, TRUNCATE TABLE е по-бързо от DELETE без клауза WHERE. Това важи както за MySQL, така и за SQL Server.
  2. Изпълнението на горния код в MySQL Workbench ще задейства Код на грешка 1175 . Не е разрешено, тъй като MySQL Workbench по подразбиране се актуализира в безопасен режим. По този начин изтриването или актуализирането на таблица без клауза WHERE не е разрешено. Все пак можете да деактивирате тази функция в Предпочитания .

2. Изтрийте WHERE в MySQL

Втората точка е за използването на DELETE с условие, операцията за изтриване на MySQL от избор. По този начин можете да изтриете един или повече записи в едно изявление, но не всички. Например, изтрийте първия ред или друг конкретен ред/редове. Ами ако търсите начин как да избегнете дублиращи се записи в SQL? Използването на условието WHERE би било решението.

Отново синтаксисът е същият в T-SQL:

-- Delete 1 record using an equality operator
DELETE FROM episodes
WHERE EpisodeID = 150;

-- Delete 3 records using IN
DELETE FROM episodes
WHERE EpisodeID IN (151,152,153);

Тук няма нищо необичайно, но следващият раздел ще бъде различен.

3. ОГРАНИЧЕНИЕ ЗА ИЗТРИВАНЕ на MySQL

LIMIT? Какъв LIMIT?

LIMIT е еквивалентен на TOP в T-SQL. Преди да имаме пример за DELETE, нека да потърсим записи, които ще изтрием. Вижте кода по-долу:

SELECT * FROM episodes
WHERE year(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo
LIMIT 2;

Ето вашия ЛИМИТ. Това ще доведе до 2 записа, както е показано на фигура 3 за изгледа на картата в dbForge Studio за MySQL:

Сега нека се опитаме да ги изтрием. Разгледайте примера по-долу:

DELETE FROM episodes
WHERE year(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo
LIMIT 2;

Преди да изтрие 2 епизода, MySQL запита всички епизоди от 1987 г. След това ги сортира по номера на сезони и епизоди. Накрая ограничи резултатите до 2 записа. Също така е подходящ метод, когато трябва да изтрием дублиращи се редове. Позволява ни да посочим условията за изтриване и да се уверим, че няма да изтрием нищо необходимо (но правенето на резервно копие все пак ще осигури безопасността на данните).

Има ли еквивалент на T-SQL? Мислите ли, че това ще работи?

DELETE TOP (2) FROM episodes
WHERE year(AirDate) = 2020
ORDER BY SeasonNo, EpisodeNo
GO

Ако поставите горния код в SQL Server Management Studio, ще получите криволичещи линии в клаузата ORDER BY. И все пак ТОП е разрешено.

Ако премахнете клаузата ORDER BY обаче, вашата заявка ще изтрие 2 произволни записа. И накрая, горният код няма да работи според очакванията.

За да имате същия резултат като в MySQL, ви трябва следния код:

DELETE FROM episodes
WHERE EpisodeID IN
(SELECT TOP 2 EpisodeID FROM Episodes
 WHERE YEAR(AirDate) = 1987
 ORDER BY SeasonNo, EpisodeNo)

В T-SQL е малко по-дълго, отколкото в MySQL. Но има още.

4. MySQL DELETE с JOIN

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

DELETE episodes
FROM episodes
INNER JOIN titles ON titles.TitleID = episodes.TitleID
WHERE titles.TitleID = 3
AND episodes.SeasonNo = 3;

Това ще работи и в T-SQL. Но ако използваме псевдоним на таблица като този:

DELETE episodes
FROM episodes e
INNER JOIN titles t ON t.TitleID = e.TitleID
WHERE t.TitleID = 3
AND e.SeasonNo = 3;

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

DELETE e
FROM episodes e
INNER JOIN titles t ON t.TitleID = e.TitleID
WHERE t.TitleID = 3
AND e.SeasonNo = 3;

Забележете разликата!

5. Изтриване на подзаявка в MySQL

Накрая се опитваме да използваме подзаявки. Това е различен начин за филтриране на записи, които искате да изтриете. Вече видяхте примера по-рано, но нека го имаме отново:

DELETE FROM episodes
WHERE EpisodeID IN
(SELECT TOP 2 EpisodeID FROM Episodes
 WHERE YEAR(AirDate) = 1987
 ORDER BY SeasonNo, EpisodeNo)

Това е напълно валиден синтаксис в T-SQL. Но дали ще работи в MySQL? Нека го променим леко:

DELETE FROM episodes
WHERE EpisodeID IN
(SELECT EpisodeID FROM Episodes
 WHERE YEAR(AirDate) = 1987
 ORDER BY SeasonNo, EpisodeNo
 LIMIT 2);

Опа! Изглежда, че сме ударили стената. Ето какво казва MySQL:

Тази версия на MySQL все още не поддържа „LIMIT &IN/ALL/ANY/SOME подзаявка“

Ами ако премахнем ключовата дума LIMIT? Това предизвиква друга грешка:

Не можете да посочите целевата таблица „епизоди“ за актуализация в клауза FROM.

Има ли решение? Промяната на кода във вложена подзаявка ще работи добре:

DELETE FROM episodes
WHERE EpisodeID IN
(SELECT EpisodeID FROM (SELECT EpisodeID FROM Episodes
 WHERE YEAR(AirDate) = 1987
 ORDER BY SeasonNo, EpisodeNo
 LIMIT 5) AS T)

Това трябва да стане. Но нека имаме един по-разумен пример:

DELETE FROM episodes
WHERE TitleID IN
(SELECT TitleID FROM titles
 WHERE `From` BETWEEN 1995 AND 2000);

Сега, каква е голямата работа с тези примери? Да видим:

  1. MySQL няма да приеме израза DELETE с филтър на подзаявка, използващ ключовата дума LIMIT. Все още не.
  2. MySQL няма да приеме DELETE от целевата таблица, равна на таблицата на подзаявката, която я филтрира.

[sendpulse-form id=”13566″]

Заключение

Дотук добре. Имате три сравнения на синтаксис DELETE за MySQL и T-SQL. Надявам се, че третата част също ще се окаже полезна за вас в бъдеще.

Тази публикация подчерта синтаксиса на MySQL при изтриване

  • Всички записи,
  • 1 или повече записа с клауза WHERE,
  • Използване на LIMIT,
  • Използване на JOIN,
  • Използване на подзаявки.

Можете лесно да видите начините за изпълнение на задачата за изтриване на колона на 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

  2. Как успешно да пренапишем стар mysql-php код с отхвърлени функции на mysql_*?

  3. Кумулативна сума за набор от редове в mysql

  4. Как мога да получа enum възможни стойности в MySQL база данни?

  5. Може ли MySQL FIND_IN_SET или еквивалент да се използва за използване на индекси?