Nasza podróż do MySQL rozpoczęła się od CREATE TABLE, a następnie INSERT. Dzisiaj przystępujemy do instrukcji MySQL DELETE. Jest prawie tak powszechny jak instrukcja MySQL UPDATE.
Ponieważ znasz T-SQL DELETE, celem jest zwiększenie produktywności przy użyciu składni MySQL. Istnieją niewielkie różnice w tych instrukcjach DELETE, ale nie ma nic, z czym nie możesz sobie poradzić. Zaczynajmy.
Przygotowywanie przykładowych danych
Jedną z najczęstszych potrzeb jest zadanie usuwania wiersza MySQL. Przyjrzymy się temu tutaj, ale najpierw musimy przygotować nasz obszar roboczy. Aby usunąć jakiekolwiek rekordy, najpierw musimy je mieć. Dlatego zbudujmy bazę danych w MySQL.
Czuję nostalgię za serialami telewizyjnymi z lat 80., więc wykorzystam odcinki MacGyvera i Quantum Leap jako przykładowe dane. Mam ostateczny plik Excela do zaimportowania danych do nowej bazy danych. Ten plik ma 2 arkusze o nazwie Tytuły i Odcinki . Zaimportujemy je do dwóch tabel.
Przed zaimportowaniem danych powinniśmy stworzyć bazę danych o nazwie serial telewizyjny z dwoma tabelami o nazwie Tytuły i Odcinki . Zadanie tworzenia tabeli MySQL jest elementarne z odpowiednim narzędziem. Używam dbForge Studio dla MySQL, a poniższe rysunki 1 i 2 przedstawiają wizualną strukturę tabeli mojej bazy danych prezentowaną przez to narzędzie.
Skrypt tabel znajduje się poniżej:
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);
Po utworzeniu bazy danych i tabel możemy zaimportować nasze dane z pliku Excel.
Najprostszym i najpotężniejszym narzędziem, którego użyłem do importowania plików Excela do MySQL, jest dbForge Studio for MySQL. Szczególnie doceniam dodanie nowej kolumny jako klucza podstawowego w tabeli docelowej. Również format automatycznego wykrywania daty i czasu jest świetnym wsparciem. Konwertuje daty z typem danych tekstowych i dziwnymi formatami daty bez kłopotów.
Ponieważ zamierzamy porównać składnię MySQL do T-SQL, możesz również zaimportować plik Excel do nowej bazy danych na SQL Server. Następnie użyj tych samych nazw baz danych i tabel, co w MySQL.
Więcej informacji
- Narzędzie do importu i eksportu MySQL w dbForge Studio dla MySQL
1. Usuń wszystkie dane z tabeli
Po pierwsze, najłatwiejsze. Spróbujmy wykonać kopię zapasową odcinków tabeli, a następnie usuń rekordy kopii zapasowej. Wykonamy standardową operację usuwania wszystkich wierszy MySQL, która może być potrzebna w różnych sytuacjach.
CREATE TABLE episodes_backup AS
SELECT * FROM episodes;
DELETE FROM episodes_backup;
Jak widać, składnia jest taka sama jak w przypadku T-SQL. Zapytanie usunie wszystkie rekordy w epizodes_backup tabela.
Kilka uwag dla Ciebie:
- Jeśli chcesz usunąć wiele wierszy lub wszystkie wiersze, funkcja TRUNCATE TABLE jest szybsza niż DELETE bez klauzuli WHERE. Dotyczy to zarówno MySQL, jak i SQL Server.
- Wykonanie powyższego kodu w MySQL Workbench wyzwoli Kod błędu 1175 . Nie jest to dozwolone, ponieważ MySQL Workbench domyślnie aktualizuje się w trybie awaryjnym. Dlatego usuwanie lub aktualizowanie tabeli bez klauzuli WHERE jest niedozwolone. Możesz jednak wyłączyć tę funkcję w Preferencjach .
2. Usuń GDZIE w MySQL
Drugi punkt dotyczy użycia DELETE z warunkiem, czyli usunięcia MySQL z operacji select. W ten sposób możesz usunąć jeden lub więcej rekordów w jednym wyciągu, ale nie wszystkie. Na przykład usuń pierwszy wiersz lub inny określony wiersz/wiersze. Co zrobić, jeśli szukasz sposobu na uniknięcie zduplikowanych rekordów w SQL? Rozwiązaniem byłoby zastosowanie warunku WHERE.
Ponownie, składnia jest taka sama w 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);
Nie ma tu nic nadzwyczajnego, ale następna sekcja będzie inna.
3. LIMIT USUŃ MySQL
LIMIT? Jaki LIMIT?
LIMIT jest odpowiednikiem TOP w T-SQL. Zanim mamy przykład DELETE, przyjrzyjmy się rekordom zapytań, które zamierzamy usunąć. Sprawdź poniższy kod:
SELECT * FROM episodes
WHERE year(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo
LIMIT 2;
Oto twój LIMIT. Spowoduje to powstanie 2 rekordów, jak pokazano na rysunku 3 dla widoku karty w dbForge Studio dla MySQL:
Teraz spróbujmy je usunąć. Spójrz na poniższy przykład:
DELETE FROM episodes
WHERE year(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo
LIMIT 2;
Przed usunięciem 2 odcinków MySQL przeszukał wszystkie odcinki z 1987 roku. Następnie posortował je według numerów sezonów i odcinków. Ostatecznie ograniczył wyniki do 2 rekordów. Jest to również odpowiednia metoda, gdy musimy usunąć zduplikowane wiersze. Pozwala nam określić warunki usunięcia i upewnić się, że nie usuniemy niczego niezbędnego (ale zrobienie kopii zapasowej i tak zapewni bezpieczeństwo danych).
Czy istnieje odpowiednik T-SQL? Czy myślisz, że to zadziała?
DELETE TOP (2) FROM episodes
WHERE year(AirDate) = 2020
ORDER BY SeasonNo, EpisodeNo
GO
Jeśli wkleisz powyższy kod w SQL Server Management Studio, otrzymasz faliste linie w klauzuli ORDER BY. Jednak TOP jest dozwolone.
Jeśli jednak usuniesz klauzulę ORDER BY, zapytanie usunie 2 losowe rekordy. Wreszcie powyższy kod nie będzie działał zgodnie z oczekiwaniami.
Aby uzyskać taki sam wynik jak w MySQL, potrzebujesz następującego kodu:
DELETE FROM episodes
WHERE EpisodeID IN
(SELECT TOP 2 EpisodeID FROM Episodes
WHERE YEAR(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo)
W T-SQL jest to nieco dłuższe niż w MySQL. Ale to nie wszystko.
4. MySQL DELETE z JOIN
Innym sposobem usuwania rekordów jest użycie go z funkcją JOIN, która filtruje rekordy, które chcesz usunąć. Jak definiuje to wielu użytkowników, jest to zadanie łączenia z usuwaniem MySQL. Nic nie wygląda inaczej, gdy nie używasz aliasu tabeli. Sprawdź poniższy przykład:
DELETE episodes
FROM episodes
INNER JOIN titles ON titles.TitleID = episodes.TitleID
WHERE titles.TitleID = 3
AND episodes.SeasonNo = 3;
To zadziała również w T-SQL. Ale jeśli użyjemy takiego aliasu tabeli:
DELETE episodes
FROM episodes e
INNER JOIN titles t ON t.TitleID = e.TitleID
WHERE t.TitleID = 3
AND e.SeasonNo = 3;
MySQL zgłosi błąd. Prawidłowa składnia jest poniżej:
DELETE e
FROM episodes e
INNER JOIN titles t ON t.TitleID = e.TitleID
WHERE t.TitleID = 3
AND e.SeasonNo = 3;
Zauważ różnicę!
5. Usuń podzapytanie w MySQL
Na koniec próbujemy użyć podzapytań. Jest to inny sposób filtrowania rekordów, które chcesz usunąć. Widziałeś już przykład jeden wcześniej, ale spróbujmy go jeszcze raz:
DELETE FROM episodes
WHERE EpisodeID IN
(SELECT TOP 2 EpisodeID FROM Episodes
WHERE YEAR(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo)
To jest doskonale poprawna składnia w T-SQL. Ale czy zadziała w MySQL? Zmieńmy to trochę:
DELETE FROM episodes
WHERE EpisodeID IN
(SELECT EpisodeID FROM Episodes
WHERE YEAR(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo
LIMIT 2);
Ups! Wygląda na to, że uderzyliśmy w ścianę. Oto, co mówi MySQL:
Ta wersja MySQL nie obsługuje jeszcze podzapytania „LIMIT I WSZYSTKIE/WSZYSTKIE/NIEKTÓRE”
Co się stanie, jeśli usuniemy słowo kluczowe LIMIT? Wywołuje kolejny błąd:
Nie możesz określić „odcinków” tabeli docelowej dla aktualizacji w klauzuli FROM.
Czy jest w pobliżu praca? Zmiana kodu na zagnieżdżone podzapytanie będzie działać dobrze:
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)
Że należy to zrobić. Ale weźmy bardziej sensowny przykład:
DELETE FROM episodes
WHERE TitleID IN
(SELECT TitleID FROM titles
WHERE `From` BETWEEN 1995 AND 2000);
O co chodzi z tymi przykładami? Zobaczmy:
- MySQL nie zaakceptuje instrukcji DELETE z filtrem podzapytania używającym słowa kluczowego LIMIT. Jeszcze nie.
- MySQL nie zaakceptuje DELETE z tabeli docelowej równej tabeli podzapytania, która ją filtruje.
[sendpulse-form id=”13566″]
Wniosek
Jak na razie dobrze. Masz trzy porównania składni DELETE dla MySQL i T-SQL. Mam nadzieję, że trzecia część okaże się przydatna również w przyszłości.
Ten post podkreślił składnię MySQL podczas usuwania
- Wszystkie rekordy,
- 1 lub więcej rekordów z klauzulą WHERE,
- Używając LIMIT,
- Korzystanie z opcji JOIN,
- Korzystanie z podzapytań.
Możesz łatwo zobaczyć sposoby wykonania zadania usuwania kolumn MySQL lub usunąć dowolny wiersz, wiele wierszy i określone rekordy według warunków.
Jeśli podobał Ci się ten post, udostępnij go na swoich ulubionych platformach społecznościowych. Daj nam również znać, co myślisz w sekcji Komentarze poniżej.