sql >> Databáze >  >> RDS >> Database

SQL DELETE pro začátečníky

Tento článek obsahuje základní SQL DELETE příkazy, které mohou začátečníci použít k odstranění dat ze svých databázových tabulek.

Smazat jeden řádek

Zde je základní příklad SQL DELETE prohlášení.

DELETE FROM Owners
WHERE OwnerId = 5;

V tomto případě odstraníme řádek s OwnerId sloupec má hodnotu 4 .

DELETE příkaz začíná DELETE FROM , za kterým následuje název tabulky (tj. tabulka obsahující data, která chcete smazat).

V některých systémech správy databází (DBMS) FROM klíčové slovo je nepovinné, ale je dobré ho zahrnout pro lepší přenositelnost (v případě, že potřebujete spustit stejný kód na jiném DBMS).

Vždy byste měli uvést WHERE klauzule, pokud nechcete smazat všechny řádky z tabulky.

Ano, čtete správně. Vynechání WHERE klauzule odstraní všechny řádky v tabulce.

Většina DBMS má různé další možnosti, které můžete použít s DELETE prohlášení, ale ty, které jsou zde uvedeny, jsou nejčastěji používané.

Všimněte si, že DELETE příkaz smaže celý řádek. Nelze smazat hodnotu jednotlivého sloupce v řádku. K tomu použijte SQL UPDATE prohlášení.

Příklad

V tomto příkladu odstraníme data z tabulky.

Nejprve se podívejme, co je v tabulce.

SELECT * FROM Owners;

Výsledek:

+-----------+-------------+------------+----------------+-------------------+
| 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, smažeme vlastníka číslo 5 a potom znovu vybereme tabulku.

DELETE FROM Owners
WHERE OwnerId = 5;

SELECT * FROM Owners;

Výsledek:

+-----------+-------------+------------+----------------+-------------------+
| 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] |
+-----------+-------------+------------+----------------+-------------------+

Vidíme, že poslední řádek byl smazán, jak je uvedeno.

Zahraniční klíče

Pokud se pokusíte smazat data, na která odkazuje cizí klíč v jiné tabulce, může se zobrazit chyba. Je to proto, že tabulka, ze které se pokoušíte odstranit data, je nadřazenou tabulkou ve vztahu. Tabulka s cizím klíčem (podřízená tabulka) závisí na datech v nadřazené tabulce (tj. datech, která se pokoušíte smazat).

Zda se zobrazí chyba nebo ne, bude záviset na tom, jak byl cizí klíč nakonfigurován. Většina DBMS podporuje různé možnosti řešení této situace. Mezi takové možnosti by mohlo patřit vyvolání chyby, kaskádování odstranění do tabulky cizích klíčů (tj. odstranění řádku z podřízené tabulky), nastavení cizího klíče na NULL nebo jej nastavte na výchozí hodnotu.

Zde je příklad pokusu o odstranění řádku, na který odkazuje cizí klíč.

DELETE FROM Owners
WHERE OwnerId = 3;

Výsledek:

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.

V tomto případě došlo k chybě a řádek nebyl smazán.

V tomto příkladu Owners.OwnerId sloupec je primární klíč této tabulky. Další tabulka s názvem PetsOwnerId sloupec, který odkazuje na tento sloupec primárního klíče, a v tomto případě existuje alespoň jeden řádek, který odkazuje na číslo vlastníka 3.

Pokud bych opravdu chtěl tento řádek smazat, musel bych aktualizovat data v podřízené tabulce tak, aby žádné řádky neukazovaly na tohoto vlastníka. Buď to, nebo upravte cizí klíč tak, aby používal jinou možnost, když dojde k operacím odstranění na primárním klíči. Úprava cizího klíče může být nežádoucí možností v závislosti na tom, co potřebujete udělat. V závislosti na vašem DBMS může také vyžadovat odstranění stávajícího klíče a jeho opětovné vytvoření.

V každém případě je tato chyba dobrá věc, protože nás upozorňuje na problém, který nastane, pokud tento řádek smažeme. Pomáhá prosazovat referenční integritu.

Pozor! Zapomenutí WHERE Ustanovení

DELETE prohlášení může být velmi nebezpečné prohlášení. Pokud vynecháte WHERE klauzule, smažete vše řádků v tabulce.

Naštěstí vás může zachránit omezení cizího klíče, pokud se pokusíte odstranit data z nadřazené tabulky vztahu.

Ale co když není. Co když vaše příkazy k odstranění nevyvolají žádné chyby?

Pojďme to zjistit!

Spusťte další DELETE příkaz, ale tentokrát zapomeneme zahrnout WHERE doložka. Tentokrát to také porovnáme s tabulkou, která není rodičem ve vztahu.

Nejprve se podívejme, co je v tabulce.

SELECT * FROM Pets;

Výsledek:

+---------+-------------+-----------+-----------+------------+
| 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       |
+---------+-------------+-----------+-----------+------------+

Dobře, takže máme osm mazlíčků. Ve skutečnosti vidíme, že tři domácí mazlíčci jsou ve vlastnictví vlastníka číslo 3 – vlastníka, kterého jsme se pokusili smazat v předchozím příkladu. To je důvod, proč jsme dostali chybu.

Každopádně pojďme dál a spusťte naše DELETE příkaz bez WHERE klauzuli, pak znovu zkontrolujte tabulku

DELETE FROM Pets;

SELECT * FROM Pets;

Výsledek:

(8 rows affected)
(0 rows affected)

(8 rows affected) část znamená, že bylo odstraněno osm řádků.

(0 rows affected) část znamená, že nebyly vybrány žádné řádky (protože v tabulce nejsou žádné řádky.

Jejda!

Mohou nastat situace, kdy ve skutečnosti potřebujete odstranit všechny řádky v tabulce. V závislosti na velikosti tabulky bude toto prohlášení vše, co potřebujete.

Pokud potřebujete smazat větší tabulku, existuje také TRUNCATE TABLE , který odebere všechny řádky z tabulky nebo zadaných oddílů tabulky, aniž by protokoloval smazání jednotlivých řádků (DELETE příkaz zaznamená tato smazání).

Proto TRUNCATE TABLE je rychlejší a využívá méně prostředků systému a protokolu transakcí.

Příklad použití TRUNCATE TABLE :

TRUNCATE TABLE Owners;

Všimněte si, že to nemusí fungovat, pokud na tabulku odkazuje omezení cizího klíče, i když neexistují žádné podřízené řádky. V takových případech DELETE může místo toho fungovat.


  1. MySQL #1093 - V klauzuli FROM nemůžete určit cílovou tabulku 'dárky' pro aktualizaci

  2. Jak používat SqlTransaction v C#

  3. Jak vybrat top 1 a seřadit podle data v Oracle SQL?

  4. Materialized Views – Identifikace poslední aktualizace