Il nostro viaggio verso MySQL è iniziato con CREATE TABLE seguito da INSERT. Oggi stiamo procedendo all'istruzione MySQL DELETE. È comune quasi quanto l'istruzione MySQL UPDATE.
Poiché hai familiarità con T-SQL DELETE, l'obiettivo è renderti più produttivo utilizzando la sintassi MySQL. Ci sono piccole differenze in queste istruzioni DELETE, ma non c'è nulla che tu non possa gestire. Iniziamo.
Preparazione dei dati di esempio
Una delle esigenze più comuni è l'attività di eliminazione della riga di MySQL. Lo esamineremo qui, ma prima dobbiamo preparare la nostra area di lavoro. Per eliminare tutti i record, dobbiamo prima averli. Quindi, costruiamo un database in MySQL.
Ho nostalgia delle serie TV degli anni '80, quindi userò episodi di MacGyver e Quantum Leap per i dati di esempio. Ho il file Excel finale per importare i dati in un nuovo database. Questo file ha 2 fogli denominati Titoli e episodi . Li importeremo entrambi in due tabelle.
Prima di importare i dati, dovremmo creare un database chiamato tv-series con due tabelle chiamate Titoli e episodi . Il lavoro di creazione della tabella MySQL è elementare con lo strumento appropriato. Sto usando dbForge Studio per MySQL e le seguenti Figure 1 e 2 mostrano la struttura della tabella visiva del mio database presentata da quello strumento.
Lo script per le tabelle è il seguente:
CREATE DATABASE IF NOT EXISTS `tv-series`;
USE `tv-series`;
CREATE TABLE `tv-series`.titles (
TitleID int NOT NULL AUTO_INCREMENT,
Title varchar(50) DEFAULT NULL,
`From` int DEFAULT NULL,
`To` int DEFAULT NULL,
PRIMARY KEY (TitleID)
)
ENGINE = INNODB,
AUTO_INCREMENT = 3,
AVG_ROW_LENGTH = 8192,
CHARACTER SET utf8mb4,
COLLATE utf8mb4_0900_ai_ci;
CREATE TABLE `tv-series`.episodes (
EpisodeID int NOT NULL AUTO_INCREMENT,
TitleID int DEFAULT NULL,
EpisodeTitle varchar(100) DEFAULT NULL,
AirDate date DEFAULT NULL,
Synopsis text DEFAULT NULL,
EpisodeNo int NOT NULL,
SeasonNo int NOT NULL,
PRIMARY KEY (EpisodeID)
)
ENGINE = INNODB,
AUTO_INCREMENT = 160,
AVG_ROW_LENGTH = 414,
CHARACTER SET utf8mb4,
COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE `tv-series`.episodes
ADD INDEX IDX_episodes_TitleID (TitleID);
Dopo aver creato il database e le tabelle, possiamo importare i nostri dati dal file Excel.
Lo strumento più semplice e potente che ho usato per importare file Excel in MySQL è dbForge Studio per MySQL. Apprezzo particolarmente l'aggiunta di una nuova colonna come chiave primaria nella tabella di destinazione. Inoltre, il formato di data e ora di rilevamento automatico è un ottimo supporto. Converte le date con un tipo di dati di testo e strani formati di data senza problemi.
Poiché confronteremo la sintassi di MySQL con T-SQL, puoi anche importare il file Excel in un nuovo database su SQL Server. Quindi, usa gli stessi nomi di database e tabelle di MySQL.
Maggiori informazioni
- Strumento di importazione ed esportazione MySQL in dbForge Studio per MySQL
1. Elimina tutti i dati dalla tabella
Primo, il più semplice. Proviamo a eseguire il backup degli episodi tabella e quindi eliminare i record del backup. Eseguiremo l'operazione standard MySQL di eliminazione di tutte le righe che potrebbe essere necessario eseguire in diverse situazioni.
CREATE TABLE episodes_backup AS
SELECT * FROM episodes;
DELETE FROM episodes_backup;
Come vedi, la sintassi è la stessa di T-SQL. La query eliminerà tutti i record in episodes_backup tabella.
Alcune note per te:
- Se devi eliminare più righe o tutte le righe, TRUNCATE TABLE è più veloce di DELETE senza una clausola WHERE. Questo vale sia per MySQL che per SQL Server.
- L'esecuzione del codice sopra in MySQL Workbench attiverà un Codice di errore 1175 . Non è consentito perché MySQL Workbench imposta automaticamente l'aggiornamento in modalità provvisoria. Pertanto, non è consentito eliminare o aggiornare una tabella senza una clausola WHERE. Tuttavia, puoi disattivare questa funzione in Preferenze .
2. Elimina DOVE in MySQL
Il secondo punto riguarda l'utilizzo di DELETE con una condizione, l'operazione MySQL delete from select. In questo modo è possibile eliminare uno o più record in una singola istruzione, ma non tutti. Ad esempio, elimina la prima riga o altre righe/righe specifiche. Cosa succede se stai cercando un modo per evitare record duplicati in SQL? L'utilizzo della condizione WHERE sarebbe la soluzione.
Anche in questo caso, la sintassi è la stessa in T-SQL:
-- Delete 1 record using an equality operator
DELETE FROM episodes
WHERE EpisodeID = 150;
-- Delete 3 records using IN
DELETE FROM episodes
WHERE EpisodeID IN (151,152,153);
Niente di straordinario qui, ma la prossima sezione sarà diversa.
3. LIMITE DI CANCELLAZIONE MySQL
LIMITE? Quale LIMITE?
LIMIT è equivalente a TOP in T-SQL. Prima di avere un esempio DELETE, interroghiamo i record che cancelleremo. Controlla il codice qui sotto:
SELECT * FROM episodes
WHERE year(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo
LIMIT 2;
Ecco il tuo LIMITE. Risulterà in 2 record come mostrato nella Figura 3 per la visualizzazione della scheda in dbForge Studio per MySQL:
Ora, proviamo a eliminarli. Dai un'occhiata all'esempio seguente:
DELETE FROM episodes
WHERE year(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo
LIMIT 2;
Prima di eliminare 2 episodi, MySQL ha interrogato tutti gli episodi del 1987, quindi li ha ordinati in base al numero di stagione e di episodio. Infine, ha limitato i risultati a 2 record. È anche un metodo adatto quando dobbiamo eliminare le righe duplicate. Ci consente di specificare le condizioni per l'eliminazione e di assicurarci di non eliminare nulla di necessario (ma fare un backup garantirebbe comunque la sicurezza dei dati).
Esiste un equivalente T-SQL? Pensi che funzionerà?
DELETE TOP (2) FROM episodes
WHERE year(AirDate) = 2020
ORDER BY SeasonNo, EpisodeNo
GO
Se incolli il codice sopra in SQL Server Management Studio, otterrai linee ondulate nella clausola ORDER BY. Eppure, TOP è consentito.
Se rimuovi la clausola ORDER BY, tuttavia, la tua query cancellerà 2 record casuali. Infine, il codice sopra non verrà eseguito come previsto.
Per ottenere lo stesso risultato di MySQL, è necessario il seguente codice:
DELETE FROM episodes
WHERE EpisodeID IN
(SELECT TOP 2 EpisodeID FROM Episodes
WHERE YEAR(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo)
È un po' più lungo in T-SQL che in MySQL. Ma c'è di più.
4. ELIMINA MySQL con ISCRIVITI
Un altro modo per eliminare i record è utilizzarlo con un JOIN che filtrerà i record che desideri eliminare. Come molti utenti lo definiscono, è l'attività di eliminazione join di MySQL. Niente sembra diverso quando non stai usando un alias di tabella. Controlla l'esempio seguente:
DELETE episodes
FROM episodes
INNER JOIN titles ON titles.TitleID = episodes.TitleID
WHERE titles.TitleID = 3
AND episodes.SeasonNo = 3;
Questo funzionerà anche in T-SQL. Ma se usiamo un alias di tabella come questo:
DELETE episodes
FROM episodes e
INNER JOIN titles t ON t.TitleID = e.TitleID
WHERE t.TitleID = 3
AND e.SeasonNo = 3;
MySQL genererà un errore. La sintassi corretta è la seguente:
DELETE e
FROM episodes e
INNER JOIN titles t ON t.TitleID = e.TitleID
WHERE t.TitleID = 3
AND e.SeasonNo = 3;
Nota la differenza!
5. Elimina sottoquery in MySQL
Infine, proviamo a utilizzare le sottoquery. È un modo diverso per filtrare i record che desideri eliminare. Hai già visto l'esempio prima, ma ripetiamolo:
DELETE FROM episodes
WHERE EpisodeID IN
(SELECT TOP 2 EpisodeID FROM Episodes
WHERE YEAR(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo)
Questa è una sintassi perfettamente valida in T-SQL. Ma funzionerà in MySQL? Cambiamo leggermente:
DELETE FROM episodes
WHERE EpisodeID IN
(SELECT EpisodeID FROM Episodes
WHERE YEAR(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo
LIMIT 2);
Ops! Sembra che abbiamo colpito il muro. Ecco cosa dice MySQL:
Questa versione di MySQL non supporta ancora "LIMIT &IN/ALL/ANY/SOME subquery"
E se rimuovessimo la parola chiave LIMIT? Attiva un altro errore:
Non è possibile specificare gli "episodi" della tabella di destinazione per un aggiornamento nella clausola FROM.
C'è una soluzione alternativa? La modifica del codice in una sottoquery nidificata funzionerà perfettamente:
DELETE FROM episodes
WHERE EpisodeID IN
(SELECT EpisodeID FROM (SELECT EpisodeID FROM Episodes
WHERE YEAR(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo
LIMIT 5) AS T)
Dovrebbe farlo. Ma facciamo un esempio più sensato:
DELETE FROM episodes
WHERE TitleID IN
(SELECT TitleID FROM titles
WHERE `From` BETWEEN 1995 AND 2000);
Ora, qual è il problema con questi esempi? Vediamo:
- MySQL non accetterà l'istruzione DELETE con un filtro di sottoquery che utilizza la parola chiave LIMIT. Non ancora.
- MySQL non accetterà DELETE dalla tabella di destinazione uguale alla tabella di sottoquery che lo filtra.
[sendpulse-form id="13566″]
Conclusione
Fin qui tutto bene. Hai tre confronti della sintassi DELETE per MySQL e T-SQL. Spero che la terza puntata ti sia utile anche in futuro.
Questo post ha evidenziato la sintassi di MySQL durante l'eliminazione
- Tutti i record,
- 1 o più record con una clausola WHERE,
- Utilizzo di LIMIT,
- Utilizzando JOIN,
- Utilizzo delle sottoquery.
Puoi facilmente vedere i modi in cui MySQL elimina le prestazioni delle attività delle colonne o elimina qualsiasi riga, più righe e record specifici in base alle condizioni.
Se ti è piaciuto questo post, sentiti libero di condividerlo sulle tue piattaforme di social media preferite. Facci sapere cosa ne pensi anche nella sezione Commenti qui sotto.