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

SQL DELETE per principianti

Questo articolo contiene DELETE SQL di base istruzioni che i principianti possono utilizzare per eliminare i dati dalle tabelle del database.

Elimina una singola riga

Ecco un esempio di base di SQL DELETE dichiarazione.

DELETE FROM Owners
WHERE OwnerId = 5;

In questo caso eliminiamo la riga in cui si trova OwnerId la colonna ha un valore di 4 .

Il DELETE l'istruzione inizia con DELETE FROM , seguito dal nome della tabella (ovvero la tabella che contiene i dati che desideri eliminare).

In alcuni sistemi di gestione di database (DBMS), il FROM la parola chiave è facoltativa, ma è una buona idea includerla per una migliore portabilità (nel caso in cui sia necessario eseguire lo stesso codice su un DBMS diverso).

Dovresti sempre includere un WHERE clausola, a meno che non si desideri eliminare tutte le righe dalla tabella.

Sì, avete letto bene. Omettendo il WHERE clausola cancellerà tutte le righe nella tabella.

La maggior parte dei DBMS ha varie altre opzioni che puoi usare con DELETE dichiarazione, ma quelli qui elencati sono quelli più comunemente usati.

Nota che il DELETE istruzione cancella l'intera riga. Non puoi eliminare il valore di una singola colonna all'interno di una riga. Per fare ciò, usa l'SQL UPDATE dichiarazione.

Esempio

In questo esempio, cancelliamo i dati da una tabella.

Per prima cosa, vediamo cosa c'è nella tabella.

SELECT * FROM Owners;

Risultato:

+-----------+-------------+------------+----------------+-------------------+
| 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 eliminiamo il proprietario numero 5, quindi selezioniamo nuovamente la tabella.

DELETE FROM Owners
WHERE OwnerId = 5;

SELECT * FROM Owners;

Risultato:

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

Possiamo vedere che l'ultima riga è stata eliminata come specificato.

Chiavi estere

È possibile che venga visualizzato un errore se si tenta di eliminare i dati a cui fa riferimento una chiave esterna in un'altra tabella. Questo perché la tabella da cui stai tentando di eliminare i dati è la tabella padre in una relazione. La tabella con la chiave esterna (la tabella figlio) si basa sui dati nella tabella padre (ovvero i dati che stai cercando di eliminare).

Se ricevi un errore o meno dipenderà da come è stata configurata la chiave esterna. La maggior parte dei DBMS supporta varie opzioni per affrontare questa situazione. Tali opzioni potrebbero includere, la generazione di un errore, il trasferimento a cascata dell'eliminazione nella tabella della chiave esterna (ovvero l'eliminazione della riga dalla tabella figlio), l'impostazione della chiave esterna su NULL o impostandolo sul valore predefinito.

Ecco un esempio di tentativo di eliminare una riga a cui fa riferimento una chiave esterna.

DELETE FROM Owners
WHERE OwnerId = 3;

Risultato:

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 questo caso, è stato generato un errore e la riga non è stata eliminata.

In questo esempio, Owners.OwnerId colonna è la chiave primaria di questa tabella. Un'altra tabella chiamata Pets ha un OwnerId colonna che fa riferimento a questa colonna di chiave primaria e, in questo caso, è presente almeno una riga che fa riferimento al numero di proprietario 3.

Se volessi davvero eliminare questa riga, dovrei aggiornare i dati nella tabella figlio in modo che nessuna riga punti a questo proprietario. O quello o modificare la chiave esterna in modo che utilizzi un'opzione diversa quando si verificano operazioni di eliminazione sulla chiave primaria. La modifica di una chiave esterna potrebbe essere un'opzione indesiderabile, a seconda di ciò che devi fare. A seconda del tuo DBMS, potrebbe anche essere necessario eliminare la chiave esistente e ricrearla.

In ogni caso, questo errore è positivo, perché ci avvisa di un problema che avremo se eliminiamo questa riga. Aiuta a rafforzare l'integrità referenziale.

Attenzione! Dimenticando il WHERE Clausola

Il DELETE affermazione può essere un'affermazione molto pericolosa. Se ometti il ​​WHERE clausola, cancellerai tutto righe nella tabella.

Fortunatamente, potresti essere salvato da vincoli di chiave esterna se tenti di eliminare i dati dalla tabella padre di una relazione.

Ma cosa succede se non lo è. Cosa succede se le tue istruzioni di eliminazione non generano errori?

Scopriamolo!

Eseguiamo un altro DELETE dichiarazione, ma questa volta dimenticheremo di includere il WHERE clausola. Inoltre, questa volta lo eseguiremo su un tavolo che non è un genitore in una relazione.

Per prima cosa, vediamo cosa c'è nella tabella.

SELECT * FROM Pets;

Risultato:

+---------+-------------+-----------+-----------+------------+
| 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, quindi abbiamo otto animali domestici. Possiamo effettivamente vedere che tre animali domestici sono di proprietà del proprietario numero 3, il proprietario che abbiamo cercato di eliminare nell'esempio precedente. Questo è il motivo per cui abbiamo ricevuto l'errore.

Ad ogni modo, andiamo avanti ed eseguiamo il nostro DELETE dichiarazione senza il WHERE clausola, quindi controlla di nuovo la tabella

DELETE FROM Pets;

SELECT * FROM Pets;

Risultato:

(8 rows affected)
(0 rows affected)

Il (8 rows affected) parte significa che sono state eliminate otto righe.

Il (0 rows affected) parte significa che non sono state selezionate righe (perché non ci sono righe nella tabella.

Ops!

Potrebbero esserci momenti in cui è effettivamente necessario eliminare tutte le righe nella tabella. A seconda delle dimensioni del tavolo, questa dichiarazione sarà tutto ciò di cui hai bisogno.

Se devi eliminare una tabella più grande, c'è anche TRUNCATE TABLE , che rimuove tutte le righe da una tabella o partizioni specificate di una tabella, senza registrare le singole eliminazioni di riga (il DELETE istruzione registra queste eliminazioni).

Pertanto, TRUNCATE TABLE è più veloce e utilizza meno risorse del registro delle transazioni e del sistema.

Esempio di utilizzo di TRUNCATE TABLE :

TRUNCATE TABLE Owners;

Si noti che ciò potrebbe non funzionare se alla tabella viene fatto riferimento da un vincolo di chiave esterna, anche se non sono presenti righe figlio. In questi casi, DELETE potrebbe invece funzionare.