Database
 sql >> Datenbank >  >> RDS >> Database

SQL DELETE für Anfänger

Dieser Artikel enthält grundlegendes SQL DELETE Anweisungen, mit denen Anfänger Daten aus ihren Datenbanktabellen löschen können.

Eine einzelne Zeile löschen

Hier ist ein einfaches Beispiel für SQL DELETE Erklärung.

DELETE FROM Owners
WHERE OwnerId = 5;

In diesem Fall löschen wir die Zeile, in der die OwnerId steht Spalte hat den Wert 4 .

Das DELETE Anweisung beginnt mit DELETE FROM , gefolgt vom Tabellennamen (d. h. der Tabelle, die die zu löschenden Daten enthält).

In einigen Datenbankverwaltungssystemen (DBMSs) ist der FROM Schlüsselwort ist optional, aber es ist eine gute Idee, es für eine bessere Portabilität einzuschließen (falls Sie denselben Code auf einem anderen DBMS ausführen müssen).

Sie sollten immer ein WHERE angeben -Klausel, es sei denn, Sie möchten alle Zeilen aus der Tabelle löschen.

Ja, Sie haben richtig gelesen. Weglassen des WHERE Klausel löscht alle Zeilen in der Tabelle.

Die meisten DBMSs haben verschiedene andere Optionen, die Sie mit DELETE verwenden können -Anweisung, aber die hier aufgelisteten sind die am häufigsten verwendeten.

Beachten Sie, dass die DELETE Anweisung löscht die ganze Zeile. Sie können den Wert einer einzelnen Spalte innerhalb einer Zeile nicht löschen. Verwenden Sie dazu das SQL UPDATE Erklärung.

Beispiel

In diesem Beispiel löschen wir Daten aus einer Tabelle.

Sehen wir uns zunächst an, was in der Tabelle steht.

SELECT * FROM Owners;

Ergebnis:

+-----------+-------------+------------+----------------+-------------------+
| OwnerId   | FirstName   | LastName   | Phone          | Email             |
|-----------+-------------+------------+----------------+-------------------|
| 1         | Homer       | Connery    | (308) 555-0100 | [email protected] |
| 2         | Bart        | Pitt       | (231) 465-3497 | [email protected]  |
| 3         | Nancy       | Stallone   | (489) 591-0408 | NULL              |
| 4         | Boris       | Biden      | (349) 611-8908 | [email protected] |
| 5         | Woody       | Eastwood   | (308) 555-0112 | [email protected] |
+-----------+-------------+------------+----------------+-------------------+

OK, löschen wir Besitzer Nummer 5 und wählen dann die Tabelle erneut aus.

DELETE FROM Owners
WHERE OwnerId = 5;

SELECT * FROM Owners;

Ergebnis:

+-----------+-------------+------------+----------------+-------------------+
| OwnerId   | FirstName   | LastName   | Phone          | Email             |
|-----------+-------------+------------+----------------+-------------------|
| 1         | Homer       | Connery    | (308) 555-0100 | [email protected] |
| 2         | Bart        | Pitt       | (231) 465-3497 | [email protected]  |
| 3         | Nancy       | Stallone   | (489) 591-0408 | NULL              |
| 4         | Boris       | Biden      | (349) 611-8908 | [email protected] |
+-----------+-------------+------------+----------------+-------------------+

Wir können sehen, dass die letzte Zeile wie angegeben gelöscht wurde.

Fremdschlüssel

Sie erhalten möglicherweise eine Fehlermeldung, wenn Sie versuchen, Daten zu löschen, auf die von einem Fremdschlüssel in einer anderen Tabelle verwiesen wird. Dies liegt daran, dass die Tabelle, aus der Sie Daten löschen möchten, die übergeordnete Tabelle in einer Beziehung ist. Die Tabelle mit dem Fremdschlüssel (die untergeordnete Tabelle) stützt sich auf Daten in der übergeordneten Tabelle (d. h. Daten, die Sie zu löschen versuchen).

Ob Sie einen Fehler erhalten oder nicht, hängt davon ab, wie der Fremdschlüssel konfiguriert wurde. Die meisten DBMS unterstützen verschiedene Optionen, um mit dieser Situation umzugehen. Solche Optionen könnten das Auslösen eines Fehlers, das Kaskadieren des Löschvorgangs in die Fremdschlüsseltabelle (d. h. das Löschen der Zeile aus der untergeordneten Tabelle) und das Festlegen des Fremdschlüssels auf NULL umfassen , oder auf den Standardwert setzen.

Hier ist ein Beispiel für den Versuch, eine Zeile zu löschen, auf die von einem Fremdschlüssel verwiesen wird.

DELETE FROM Owners
WHERE OwnerId = 3;

Ergebnis:

Msg 547, Level 16, State 0, Line 1
The DELETE statement conflicted with the REFERENCE constraint "FK_Pets_Owners". The conflict occurred in database "PetHotel", table "dbo.Pets", column 'OwnerId'.

The statement has been terminated.

In diesem Fall wurde ein Fehler ausgelöst und die Zeile wurde nicht gelöscht.

In diesem Beispiel die Owners.OwnerId Spalte ist der Primärschlüssel dieser Tabelle. Eine weitere Tabelle namens Pets hat eine OwnerId Spalte, die auf diese Primärschlüsselspalte verweist, und in diesem Fall gibt es mindestens eine Zeile, die auf Besitzernummer 3 verweist.

Wenn ich diese Zeile wirklich löschen wollte, müsste ich die Daten in der untergeordneten Tabelle aktualisieren, damit keine Zeilen auf diesen Eigentümer verweisen. Entweder das, oder Sie ändern den Fremdschlüssel so, dass er eine andere Option verwendet, wenn Löschvorgänge für den Primärschlüssel ausgeführt werden. Je nachdem, was Sie tun müssen, kann das Ändern eines Fremdschlüssels eine unerwünschte Option sein. Abhängig von Ihrem DBMS kann es auch erforderlich sein, den vorhandenen Schlüssel zu löschen und neu zu erstellen.

In jedem Fall ist dieser Fehler eine gute Sache, da er uns auf ein Problem hinweist, das wir haben werden, wenn wir diese Zeile löschen. Es hilft, die referenzielle Integrität durchzusetzen.

Achtung! Vergessen des WHERE Klausel

Das DELETE Aussage kann eine sehr gefährliche Aussage sein. Wenn Sie WHERE weglassen -Klausel löschen Sie alle Zeilen in der Tabelle.

Glücklicherweise können Sie durch Fremdschlüsseleinschränkungen gerettet werden, wenn Sie versuchen, Daten aus der übergeordneten Tabelle einer Beziehung zu löschen.

Aber was ist, wenn es nicht so ist? Was ist, wenn Ihre Löschanweisungen keine Fehler auslösen?

Lass es uns herausfinden!

Lassen Sie uns ein weiteres DELETE ausführen -Anweisung, aber dieses Mal vergessen wir, das WHERE einzufügen Klausel. Außerdem führen wir es dieses Mal mit einer Tabelle aus, die kein Elternteil in einer Beziehung ist.

Sehen wir uns zuerst an, was in der Tabelle steht.

SELECT * FROM Pets;

Ergebnis:

+---------+-------------+-----------+-----------+------------+
| PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
|---------+-------------+-----------+-----------+------------|
| 1       | 2           | 3         | Fluffy    | 2020-11-20 |
| 2       | 3           | 3         | Fetch     | 2019-08-16 |
| 3       | 2           | 2         | Scratch   | 2018-10-01 |
| 4       | 3           | 3         | Wag       | 2020-03-15 |
| 5       | 1           | 1         | Tweet     | 2020-11-28 |
| 6       | 3           | 4         | Fluffy    | 2020-09-17 |
| 7       | 3           | 2         | Bark      | NULL       |
| 8       | 2           | 4         | Meow      | NULL       |
+---------+-------------+-----------+-----------+------------+

OK, wir haben also acht Haustiere. Wir können tatsächlich sehen, dass drei Haustiere dem Besitzer Nummer 3 gehören – dem Besitzer, den wir im vorherigen Beispiel versucht haben zu löschen. Aus diesem Grund haben wir den Fehler erhalten.

Wie auch immer, lass uns weitermachen und unser DELETE ausführen Anweisung ohne WHERE -Klausel, dann überprüfen Sie die Tabelle erneut

DELETE FROM Pets;

SELECT * FROM Pets;

Ergebnis:

(8 rows affected)
(0 rows affected)

Der (8 rows affected) Teil bedeutet, dass acht Zeilen gelöscht wurden.

Der (0 rows affected) Teil bedeutet, dass keine Zeilen ausgewählt wurden (weil es keine Zeilen in der Tabelle gibt.

Hoppla!

Es kann vorkommen, dass Sie tatsächlich alle Zeilen in der Tabelle löschen müssen. Je nach Größe der Tabelle reicht diese Anweisung aus.

Wenn Sie eine größere Tabelle löschen müssen, gibt es auch TRUNCATE TABLE , das alle Zeilen aus einer Tabelle oder bestimmten Partitionen einer Tabelle entfernt, ohne die einzelnen Zeilenlöschungen zu protokollieren (das DELETE -Anweisung protokolliert diese Löschungen).

Daher TRUNCATE TABLE ist schneller und verbraucht weniger System- und Transaktionsprotokollressourcen.

Beispiel für die Verwendung von TRUNCATE TABLE :

TRUNCATE TABLE Owners;

Beachten Sie, dass dies möglicherweise nicht funktioniert, wenn auf die Tabelle durch eine Fremdschlüsseleinschränkung verwiesen wird, selbst wenn keine untergeordneten Zeilen vorhanden sind. In solchen Fällen DELETE könnte stattdessen funktionieren.