Mysql
 sql >> Datenbank >  >> RDS >> Mysql

TOP 5 MySQL-Löschsyntax mit Tipps für T-SQL-Entwickler

Unsere Reise zu MySQL begann mit CREATE TABLE, gefolgt von INSERT. Heute fahren wir mit der MySQL DELETE-Anweisung fort. Es ist fast so verbreitet wie die MySQL-UPDATE-Anweisung.

Da Sie mit T-SQL DELETE vertraut sind, besteht das Ziel darin, Sie mit der MySQL-Syntax produktiver zu machen. Es gibt geringfügige Unterschiede in diesen DELETE-Anweisungen, aber es gibt nichts, was Sie nicht bewältigen können. Fangen wir an.

Vorbereitung der Beispieldaten

Eine der häufigsten Anforderungen ist die MySQL-Aufgabe zum Löschen von Zeilen. Wir werden es hier untersuchen, aber zuerst müssen wir unseren Arbeitsbereich vorbereiten. Um Datensätze zu löschen, müssen wir sie zuerst haben. Lassen Sie uns also eine Datenbank in MySQL erstellen.

Ich fühle mich nostalgisch gegenüber Fernsehserien aus den 80er Jahren, also werde ich Episoden von MacGyver und Quantum Leap als Beispieldaten verwenden. Ich habe die endgültige Excel-Datei, um die Daten in eine neue Datenbank zu importieren. Diese Datei hat 2 Blätter namens Titles und Episoden . Wir werden sie beide in zwei Tabellen importieren.

Bevor wir Daten importieren, sollten wir eine Datenbank mit dem Namen tv-series erstellen mit zwei Tabellen namens Titles und Episoden . Der MySQL-Auftrag zum Erstellen einer Tabelle ist mit dem richtigen Tool elementar. Ich verwende dbForge Studio für MySQL, und die folgenden Abbildungen 1 und 2 zeigen die visuelle Tabellenstruktur meiner Datenbank, die von diesem Tool dargestellt wird.

Das Skript für die Tabellen ist unten:

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

Nachdem wir die Datenbank und die Tabellen erstellt haben, können wir unsere Daten aus der Excel-Datei importieren.

Das einfachste und leistungsfähigste Tool, das ich zum Importieren von Excel-Dateien in MySQL verwendet habe, ist dbForge Studio for MySQL. Ich schätze besonders das Hinzufügen einer neuen Spalte als Primärschlüssel in der Zieltabelle. Auch das automatisch erkannte Datums- und Zeitformat ist eine großartige Unterstützung. Es konvertiert Daten mit einem Textdatentyp und seltsamen Datumsformaten problemlos.

Da wir die MySQL-Syntax mit T-SQL vergleichen werden, können Sie die Excel-Datei auch in eine neue Datenbank auf dem SQL-Server importieren. Verwenden Sie dann die gleichen Datenbank- und Tabellennamen wie in MySQL.

Weitere Informationen

  • MySQL-Import- und Export-Tool in dbForge Studio für MySQL

1. Alle Daten aus Tabelle löschen

Zuerst das einfachste. Versuchen wir, die Episoden zu sichern Tabelle und löschen Sie dann die Datensätze der Sicherung. Wir führen den standardmäßigen MySQL-Vorgang zum Löschen aller Zeilen durch, den Sie möglicherweise in verschiedenen Situationen ausführen müssen.

CREATE TABLE episodes_backup AS
SELECT * FROM episodes;

DELETE FROM episodes_backup;

Wie Sie sehen, ist die Syntax dieselbe wie bei T-SQL. Die Abfrage löscht alle Aufzeichnungen in episodes_backup Tabelle.

Ein paar Anmerkungen für Sie:

  1. Wenn Sie mehrere Zeilen oder alle Zeilen löschen müssen, ist TRUNCATE TABLE schneller als DELETE ohne eine WHERE-Klausel. Dies gilt sowohl für MySQL als auch für SQL Server.
  2. Das Ausführen des obigen Codes in MySQL Workbench löst einen Fehlercode 1175 aus . Dies ist nicht zulässig, da MySQL Workbench standardmäßig auf das Update im abgesicherten Modus eingestellt ist. Daher ist ein Löschen oder Aktualisieren einer Tabelle ohne WHERE-Klausel nicht zulässig. Sie können diese Funktion jedoch in den Einstellungen deaktivieren .

2. Löschen Sie WHERE in MySQL

Der zweite Punkt betrifft die Verwendung von DELETE mit einer Bedingung, dem MySQL-Löschvorgang aus der Auswahl. Auf diese Weise können Sie einen oder mehrere Datensätze in einer einzigen Anweisung löschen, aber nicht alle. Löschen Sie beispielsweise die erste Zeile oder eine andere bestimmte Zeile/Zeilen. Was ist, wenn Sie nach einer Möglichkeit suchen, doppelte Datensätze in SQL zu vermeiden? Die Verwendung der WHERE-Bedingung wäre die Lösung.

Auch hier ist die Syntax in T-SQL dieselbe:

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

Nichts Außergewöhnliches hier, aber der nächste Abschnitt wird anders sein.

3. MySQL-LÖSCHGRENZE

GRENZE? Welche LIMIT?

LIMIT entspricht TOP in T-SQL. Bevor wir ein DELETE-Beispiel haben, lassen Sie uns Datensätze abfragen, die wir löschen werden. Sehen Sie sich den folgenden Code an:

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

Hier ist Ihr LIMIT. Dies führt zu 2 Datensätzen, wie in Abbildung 3 für die Kartenansicht in dbForge Studio für MySQL gezeigt:

Versuchen wir nun, sie zu löschen. Sehen Sie sich das folgende Beispiel an:

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

Vor dem Löschen von 2 Episoden hat MySQL alle Episoden von 1987 abgefragt. Dann hat es sie in Staffel- und Episodennummern sortiert. Schließlich wurden die Ergebnisse auf 2 Datensätze begrenzt. Es ist auch eine geeignete Methode, wenn wir doppelte Zeilen löschen müssen. Damit können wir die Bedingungen für das Löschen festlegen und sicherstellen, dass wir nichts Notwendiges löschen (aber ein Backup würde trotzdem die Datensicherheit gewährleisten).

Gibt es ein T-SQL-Äquivalent? Glaubst du, das wird funktionieren?

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

Wenn Sie den obigen Code in SQL Server Management Studio einfügen, erhalten Sie verschnörkelte Linien in der ORDER BY-Klausel. TOP ist jedoch erlaubt.

Wenn Sie jedoch die ORDER BY-Klausel entfernen, löscht Ihre Abfrage zwei zufällige Datensätze. Schließlich wird der obige Code nicht wie erwartet ausgeführt.

Um dasselbe Ergebnis wie in MySQL zu erhalten, benötigen Sie den folgenden Code:

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

In T-SQL ist es etwas länger als in MySQL. Aber es gibt noch mehr.

4. MySQL DELETE mit JOIN

Eine andere Möglichkeit, Datensätze zu löschen, besteht darin, sie mit einem JOIN zu verwenden, der Datensätze filtert, die Sie löschen möchten. Wie viele Benutzer es definieren, ist es die MySQL-Lösch-Join-Aufgabe. Nichts sieht anders aus, wenn Sie keinen Tabellenalias verwenden. Sehen Sie sich das folgende Beispiel an:

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

Dies funktioniert auch in T-SQL. Aber wenn wir einen Tabellenalias wie diesen verwenden:

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

MySQL wird einen Fehler ausgeben. Die korrekte Syntax ist unten:

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

Beachten Sie den Unterschied!

5. Unterabfrage in MySQL löschen

Schließlich versuchen wir es mit Unterabfragen. Es ist eine andere Möglichkeit, Datensätze zu filtern, die Sie löschen möchten. Sie haben das Beispiel bereits früher gesehen, aber lassen Sie es uns noch einmal tun:

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

Dies ist eine vollkommen gültige Syntax in T-SQL. Aber wird es in MySQL funktionieren? Ändern wir es etwas:

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

Hoppla! Sieht aus, als wären wir gegen die Wand gefahren. Folgendes sagt MySQL:

Diese Version von MySQL unterstützt noch nicht die Unterabfrage „LIMIT &IN/ALL/ANY/SOME“

Was passiert, wenn wir das Keyword LIMIT entfernen? Es löst einen weiteren Fehler aus:

Sie können die Zieltabelle „Episoden“ für eine Aktualisierung nicht in der FROM-Klausel angeben.

Gibt es eine Problemumgehung? Das Ändern des Codes in eine verschachtelte Unterabfrage wird problemlos ausgeführt:

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)

Das sollte es tun. Aber lassen Sie uns ein vernünftigeres Beispiel haben:

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

Nun, was ist die große Sache mit diesen Beispielen? Mal sehen:

  1. MySQL akzeptiert die DELETE-Anweisung nicht mit einem Unterabfragefilter, der das Schlüsselwort LIMIT verwendet. Noch nicht.
  2. MySQL akzeptiert DELETE aus der Zieltabelle nicht gleich der Unterabfragetabelle, die es filtert.

[sendpulse-form id=”13566″]

Schlussfolgerung

So weit, ist es gut. Sie haben drei DELETE-Syntaxvergleiche für MySQL und T-SQL. Ich hoffe, dass sich auch der dritte Teil für Sie in Zukunft als nützlich erweisen wird.

Dieser Beitrag hat die MySQL-Syntax beim Löschen hervorgehoben

  • Alle Datensätze,
  • 1 oder mehr Datensätze mit einer WHERE-Klausel,
  • Limit verwenden,
  • Mit JOIN
  • Unterabfragen verwenden.

Sie können leicht sehen, wie die MySQL-Aufgabe zum Löschen von Spalten funktioniert, oder jede Zeile, mehrere Zeilen und bestimmte Datensätze nach Bedingungen löschen.

Wenn Ihnen dieser Beitrag gefallen hat, können Sie ihn gerne auf Ihren bevorzugten Social-Media-Plattformen teilen. Teilen Sie uns auch Ihre Meinung im Kommentarbereich unten mit.