Нашето пътуване до 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 таблица.
Няколко бележки за вас:
- Ако трябва да изтриете няколко реда или всички редове, TRUNCATE TABLE е по-бързо от DELETE без клауза WHERE. Това важи както за MySQL, така и за SQL Server.
- Изпълнението на горния код в 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);
Сега, каква е голямата работа с тези примери? Да видим:
- MySQL няма да приеме израза DELETE с филтър на подзаявка, използващ ключовата дума LIMIT. Все още не.
- MySQL няма да приеме DELETE от целевата таблица, равна на таблицата на подзаявката, която я филтрира.
[sendpulse-form id=”13566″]
Заключение
Дотук добре. Имате три сравнения на синтаксис DELETE за MySQL и T-SQL. Надявам се, че третата част също ще се окаже полезна за вас в бъдеще.
Тази публикация подчерта синтаксиса на MySQL при изтриване
- Всички записи,
- 1 или повече записа с клауза WHERE,
- Използване на LIMIT,
- Използване на JOIN,
- Използване на подзаявки.
Можете лесно да видите начините за изпълнение на задачата за изтриване на колона на MySQL или да изтриете всеки ред, множество редове и конкретни записи по условия.
Ако тази публикация ви е харесала, не се колебайте да я споделите в любимите си социални медийни платформи. Кажете ни също какво мислите в секцията за коментари по-долу.