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'


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow