MySQL
ELIMINA
Ricerca…
Sintassi
- ELIMINA [LOW_PRIORITY] [QUICK] [IGNORA] FROM table [WHERE conditions] [ORDER BY expression [ASC | DESC]] [LIMIT number_rows]; /// Sintassi per eliminare le righe da una singola tabella
Parametri
Parametro | Dettagli |
---|---|
BASSA PRIORITÀ | Se viene fornito LOW_PRIORITY , l'eliminazione verrà ritardata fino a quando non ci saranno processi in lettura dalla tabella |
IGNORARE | Se viene fornito IGNORE , tutti gli errori incontrati durante l'eliminazione vengono ignorati |
tavolo | La tabella da cui si intende eliminare i record |
Dove condizioni | Le condizioni che devono essere soddisfatte per i record da eliminare. Se non vengono fornite condizioni, tutti i record dalla tabella verranno eliminati |
ORDINA PER espressione | Se viene fornito ORDER BY , i record verranno eliminati nell'ordine indicato |
LIMITE | Controlla il numero massimo di record da eliminare dalla tabella. Dato number_rows sarà cancellato. |
Elimina con clausola Where
DELETE FROM `table_name` WHERE `field_one` = 'value_one'
Questo cancellerà tutte le righe dalla tabella in cui il contenuto di field_one
per quella riga corrisponde a 'value_one'
La clausola WHERE
funziona allo stesso modo di una selezione, quindi è possibile utilizzare cose come >
, <
, <>
o LIKE
.
Avviso: è necessario utilizzare le clausole condizionali (WHERE, LIKE) nella query di eliminazione. Se non si usano clausole condizionali, tutti i dati da quella tabella verranno eliminati.
Elimina tutte le righe da una tabella
DELETE FROM table_name ;
Questo cancellerà tutto, tutte le righe dalla tabella. È l'esempio più semplice della sintassi. Mostra anche che le istruzioni DELETE
dovrebbero essere utilizzate con estrema attenzione in quanto potrebbero svuotare una tabella, se la clausola WHERE
viene omessa.
LIMITAZIONE delle eliminazioni
DELETE FROM `table_name` WHERE `field_one` = 'value_one' LIMIT 1
Funziona allo stesso modo dell'esempio "Elimina con clausola Where", ma interromperà la cancellazione una volta rimosso il numero limitato di righe.
Se stai limitando le righe per la cancellazione in questo modo, tieni presente che eliminerà la prima riga che corrisponde ai criteri. Potrebbe non essere quello che ci si aspetterebbe, in quanto i risultati possono tornare non ordinati se non sono esplicitamente ordinati.
Eliminazioni di più tabelle
L'istruzione DELETE
di MySQL può utilizzare il costrutto JOIN
, consentendo anche di specificare da quali tabelle eliminare. Questo è utile per evitare query annidate. Dato lo schema:
create table people
( id int primary key,
name varchar(100) not null,
gender char(1) not null
);
insert people (id,name,gender) values
(1,'Kathy','f'),(2,'John','m'),(3,'Paul','m'),(4,'Kim','f');
create table pets
( id int auto_increment primary key,
ownerId int not null,
name varchar(100) not null,
color varchar(100) not null
);
insert pets(ownerId,name,color) values
(1,'Rover','beige'),(2,'Bubbles','purple'),(3,'Spot','black and white'),
(1,'Rover2','white');
id | nome | Genere |
---|---|---|
1 | Kathy | f |
2 | John | m |
3 | Paolo | m |
4 | Kim | f |
id | ownerid | nome | colore |
---|---|---|---|
1 | 1 | vagabondo | beige |
2 | 2 | bolle | viola |
4 | 1 | Rover2 | bianca |
Se vogliamo rimuovere gli animali domestici di Paul, la dichiarazione
DELETE p2
FROM pets p2
WHERE p2.ownerId in (
SELECT p1.id
FROM people p1
WHERE p1.name = 'Paul');
può essere riscritto come:
DELETE p2 -- remove only rows from pets
FROM people p1
JOIN pets p2
ON p2.ownerId = p1.id
WHERE p1.name = 'Paul';
1 riga cancellata
Spot viene eliminato dagli animali domestici
p1
e p2
sono alias per i nomi delle tabelle, particolarmente utili per nomi di tabelle lunghe e facilità di lettura.
Per rimuovere sia la persona che l'animale domestico:
DELETE p1, p2 -- remove rows from both tables
FROM people p1
JOIN pets p2
ON p2.ownerId = p1.id
WHERE p1.name = 'Paul';
2 righe cancellate
Spot viene eliminato dagli animali domestici
Paul viene cancellato dalle persone
chiavi esterne
Quando l'istruzione DELETE esegue il richiamo di tabelle con una chiave esterna, l'ottimizzatore può elaborare le tabelle in un ordine che non segue la relazione. Aggiungendo ad esempio una chiave esterna alla definizione di pets
ALTER TABLE pets ADD CONSTRAINT `fk_pets_2_people` FOREIGN KEY (ownerId) references people(id) ON DELETE CASCADE;
il motore può provare a eliminare le voci dalle people
prima degli pets
, provocando il seguente errore:
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test`.`pets`, CONSTRAINT `pets_ibfk_1` FOREIGN KEY (`ownerId`) REFERENCES `people` (`id`))
La soluzione in questo caso è eliminare la riga dalle people
e fare affidamento sulle funzionalità ON DELETE
InnoDB
per propagare la cancellazione:
DELETE FROM people
WHERE name = 'Paul';
2 righe cancellate
Paul viene cancellato dalle persone
Spot viene eliminato su cascata da Animali domestici
Un'altra soluzione consiste nel disabilitare temporaneamente il controllo sulle chiavi esterne:
SET foreign_key_checks = 0;
DELETE p1, p2 FROM people p1 JOIN pets p2 ON p2.ownerId = p1.id WHERE p1.name = 'Paul';
SET foreign_key_checks = 1;
Eliminazione di base
DELETE FROM `myTable` WHERE `someColumn` = 'something'
La clausola WHERE
è facoltativa, ma senza di essa tutte le righe vengono eliminate.
DELETE vs TRUNCATE
TRUNCATE tableName;
Questo cancellerà tutti i dati e resetterà l'indice AUTO_INCREMENT
. È molto più veloce di DELETE FROM tableName
su un enorme set di dati. Può essere molto utile durante lo sviluppo / test.
Quando si tronca una tabella, il server SQL non elimina i dati, elimina la tabella e la ricrea, in modo da deallocare le pagine in modo che vi sia la possibilità di ripristinare i dati troncati prima delle pagine sovrascritte. (Lo spazio non può essere recuperato immediatamente per innodb_file_per_table=OFF
.)
DELETE multi tabella
MySQL consente di specificare da quale tabella devono essere cancellate le righe corrispondenti
-- remove only the employees
DELETE e
FROM Employees e JOIN Department d ON e.department_id = d.department_id
WHERE d.name = 'Sales'
-- remove employees and department
DELETE e, d
FROM Employees e JOIN Department d ON e.department_id = d.department_id
WHERE d.name = 'Sales'
-- remove from all tables (in this case same as previous)
DELETE
FROM Employees e JOIN Department d ON e.department_id = d.department_id
WHERE d.name = 'Sales'