sql >> Database >  >> RDS >> Database

SQL DELETE voor beginners

Dit artikel bevat basis SQL DELETE instructies die beginners kunnen gebruiken om gegevens uit hun databasetabellen te verwijderen.

Een enkele rij verwijderen

Hier is een eenvoudig voorbeeld van de SQL DELETE verklaring.

DELETE FROM Owners
WHERE OwnerId = 5;

In dit geval verwijderen we de rij waar de OwnerId kolom heeft een waarde van 4 .

De DELETE instructie begint met DELETE FROM , gevolgd door de tabelnaam (d.w.z. de tabel die de gegevens bevat die u wilt verwijderen).

In sommige Database Management Systemen (DBMS'en) is de FROM trefwoord is optioneel, maar het is een goed idee om het op te nemen voor een betere draagbaarheid (voor het geval u dezelfde code op een ander DBMS moet uitvoeren).

Je moet altijd een WHERE . opnemen clausule, tenzij u alle rijen uit de tabel wilt verwijderen.

Ja, u leest het goed. Het weglaten van de WHERE clausule verwijdert alle rijen in de tabel.

De meeste DBMS'en hebben verschillende andere opties die u kunt gebruiken met de DELETE verklaring, maar de hier vermelde zijn de meest gebruikte.

Merk op dat de DELETE statement verwijdert de hele rij. U kunt de waarde van een afzonderlijke kolom binnen een rij niet verwijderen. Gebruik hiervoor de SQL UPDATE verklaring.

Voorbeeld

In dit voorbeeld verwijderen we gegevens uit een tabel.

Laten we eerst eens kijken wat er in de tabel staat.

SELECT * FROM Owners;

Resultaat:

+-----------+-------------+------------+----------------+-------------------+
| 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 laten we eigenaar nummer 5 verwijderen en de tafel opnieuw selecteren.

DELETE FROM Owners
WHERE OwnerId = 5;

SELECT * FROM Owners;

Resultaat:

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

We kunnen zien dat de laatste rij is verwijderd zoals gespecificeerd.

Buitenlandse sleutels

U kunt een foutmelding krijgen als u gegevens probeert te verwijderen waarnaar wordt verwezen door een externe sleutel in een andere tabel. Dit komt omdat de tabel waaruit u gegevens probeert te verwijderen, de bovenliggende tabel in een relatie is. De tabel met de refererende sleutel (de onderliggende tabel) is afhankelijk van gegevens in de bovenliggende tabel (d.w.z. gegevens die u probeert te verwijderen).

Of u een foutmelding krijgt of niet, hangt af van hoe de externe sleutel is geconfigureerd. De meeste DBMS'en ondersteunen verschillende opties om met deze situatie om te gaan. Dergelijke opties kunnen zijn:een fout genereren, het verwijderen naar de tabel met externe sleutels trapsgewijs (d.w.z. de rij verwijderen uit de onderliggende tabel), de externe sleutel instellen op NULL , of het instellen op de standaardwaarde.

Hier is een voorbeeld van het verwijderen van een rij waarnaar wordt verwezen door een externe sleutel.

DELETE FROM Owners
WHERE OwnerId = 3;

Resultaat:

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 dit geval is er een fout opgetreden en is de rij niet verwijderd.

In dit voorbeeld is de Owners.OwnerId kolom is de primaire sleutel van deze tabel. Een andere tafel genaamd Pets heeft een OwnerId kolom die verwijst naar deze primaire sleutelkolom, en in dit geval is er minstens één rij die verwijst naar eigenaar nummer 3.

Als ik deze rij echt zou willen verwijderen, zou ik de gegevens in de onderliggende tabel moeten bijwerken, zodat geen rijen naar deze eigenaar verwijzen. Ofwel dat, of wijzig de externe sleutel zodat deze een andere optie gebruikt wanneer verwijderbewerkingen plaatsvinden op de primaire sleutel. Het wijzigen van een externe sleutel kan een ongewenste optie zijn, afhankelijk van wat u moet doen. Afhankelijk van uw DBMS kan het ook nodig zijn om de bestaande sleutel te laten vallen en opnieuw aan te maken.

In ieder geval is deze fout een goede zaak, omdat het ons waarschuwt voor een probleem dat we zullen hebben als we deze rij verwijderen. Het helpt referentiële integriteit af te dwingen.

Let op! De WHERE . vergeten Clausule

De DELETE verklaring kan een zeer gevaarlijke verklaring zijn. Als u de WHERE . weglaat clausule, verwijdert u alle rijen in de tabel.

Gelukkig kunt u worden gered door externe sleutelbeperkingen als u gegevens probeert te verwijderen uit de bovenliggende tabel van een relatie.

Maar wat als dat niet zo is. Wat als er geen fouten worden gegenereerd door uw verwijderinstructies?

Dat zoeken we uit!

Laten we nog een DELETE uitvoeren statement, maar deze keer vergeten we de WHERE clausule. Deze keer zullen we het ook uitvoeren tegen een tafel die geen ouder is in een relatie.

Laten we eerst eens kijken wat er in de tabel staat.

SELECT * FROM Pets;

Resultaat:

+---------+-------------+-----------+-----------+------------+
| 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é, dus we hebben acht huisdieren. We kunnen eigenlijk zien dat drie huisdieren eigendom zijn van eigenaar nummer 3 - de eigenaar die we in het vorige voorbeeld probeerden te verwijderen. Dit is waarom we de fout hebben gekregen.

Hoe dan ook, laten we doorgaan en onze DELETE . uitvoeren statement zonder de WHERE clausule, controleer dan de tabel opnieuw

DELETE FROM Pets;

SELECT * FROM Pets;

Resultaat:

(8 rows affected)
(0 rows affected)

De (8 rows affected) gedeelte betekent dat er acht rijen zijn verwijderd.

De (0 rows affected) onderdeel betekent dat er geen rijen zijn geselecteerd (omdat er geen rijen in de tabel staan.

Oeps!

Het kan voorkomen dat u in feite alle rijen in de tabel moet verwijderen. Afhankelijk van de grootte van de tafel, is deze verklaring alles wat je nodig hebt.

Als u een grotere tabel moet verwijderen, is er ook TRUNCATE TABLE , die alle rijen uit een tabel of gespecificeerde partities van een tabel verwijdert, zonder de afzonderlijke rijverwijderingen te loggen (de DELETE statement registreert deze verwijderingen).

Daarom TRUNCATE TABLE is sneller en gebruikt minder systeem- en transactielogboekbronnen.

Voorbeeld van het gebruik van TRUNCATE TABLE :

TRUNCATE TABLE Owners;

Houd er rekening mee dat dit mogelijk niet werkt als er naar de tabel wordt verwezen door een externe-sleutelbeperking, zelfs als er geen onderliggende rijen zijn. In dergelijke gevallen DELETE kan in plaats daarvan werken.


  1. Hoe maak en gebruik je een tijdelijke tabel in de Oracle-opgeslagen procedure?

  2. Postgres:vacuümcommando ruimt dode tupels niet op

  3. Postgres gegevenstype cast

  4. Goed nieuws voor Standard Edition-klanten in SQL Server 2014