Mysql
 sql >> Base de données >  >> RDS >> Mysql

TOP 5 MySQL Delete Syntax avec des conseils pour les développeurs T-SQL

Notre voyage vers MySQL a commencé avec CREATE TABLE suivi de INSERT. Aujourd'hui, nous procédons à l'instruction MySQL DELETE. Elle est presque aussi courante que l'instruction MySQL UPDATE.

Puisque vous êtes familiarisé avec T-SQL DELETE, l'objectif est de vous rendre plus productif en utilisant la syntaxe MySQL. Il existe des différences mineures dans ces instructions DELETE, mais il n'y a rien que vous ne puissiez pas gérer. Commençons.

Préparation des exemples de données

L'un des besoins les plus courants est la tâche MySQL delete row. Nous allons l'examiner ici, mais d'abord, nous devons préparer notre zone de travail. Pour supprimer des enregistrements, nous devons d'abord les avoir. Construisons donc une base de données dans MySQL.

Je suis nostalgique des séries télévisées des années 80, je vais donc utiliser des épisodes de MacGyver et Quantum Leap comme exemples de données. J'ai le fichier Excel final pour importer les données dans une nouvelle base de données. Ce fichier comporte 2 feuilles nommées Titres et Épisodes . Nous allons les importer tous les deux dans deux tables.

Avant d'importer des données, nous devrions créer une base de données nommée tv-series avec deux tables appelées Titres et Épisodes . Le travail de création de table MySQL est élémentaire avec l'outil approprié. J'utilise dbForge Studio pour MySQL et les figures 1 et 2 suivantes affichent la structure de table visuelle de ma base de données présentée par cet outil.

Le script pour les tables est ci-dessous :

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);

Après avoir créé la base de données et les tables, nous pouvons importer nos données à partir du fichier Excel.

L'outil le plus simple et le plus puissant que j'ai utilisé pour importer des fichiers Excel dans MySQL est dbForge Studio for MySQL. J'apprécie particulièrement l'ajout d'une nouvelle colonne comme clé primaire dans la table cible. En outre, le format de date et d'heure de détection automatique est un excellent support. Il convertit les dates avec un type de données texte et des formats de date étranges sans tracas.

Puisque nous allons comparer la syntaxe MySQL à T-SQL, vous pouvez également importer le fichier Excel dans une nouvelle base de données sur SQL Server. Ensuite, utilisez les mêmes noms de base de données et de table que dans MySQL.

Plus d'informations

  • Outil d'importation et d'exportation MySQL dans dbForge Studio pour MySQL

1. Supprimer toutes les données du tableau

Tout d'abord, le plus simple. Essayons de sauvegarder les épisodes table puis supprimer les enregistrements de la sauvegarde. Nous effectuerons l'opération MySQL standard de suppression de toutes les lignes que vous devrez peut-être effectuer dans différentes situations.

CREATE TABLE episodes_backup AS
SELECT * FROM episodes;

DELETE FROM episodes_backup;

Comme vous le voyez, la syntaxe est la même que pour T-SQL. La requête supprimera tous les enregistrements dans episodes_backup tableau.

Quelques notes pour vous :

  1. Si vous devez supprimer plusieurs lignes ou toutes les lignes, TRUNCATE TABLE est plus rapide que DELETE sans clause WHERE. Cela est vrai pour MySQL et SQL Server.
  2. L'exécution du code ci-dessus dans MySQL Workbench déclenchera un code d'erreur 1175 . Ce n'est pas autorisé car MySQL Workbench utilise par défaut la mise à jour en mode sans échec. Ainsi, une suppression ou une mise à jour d'une table sans clause WHERE n'est pas autorisée. Cependant, vous pouvez désactiver cette fonctionnalité dans Préférences .

2. Supprimer WHERE dans MySQL

Le deuxième point concerne l'utilisation de DELETE avec une condition, l'opération MySQL delete from select. De cette façon, vous pouvez supprimer un ou plusieurs enregistrements dans une seule instruction, mais pas tous. Par exemple, supprimez la première ligne ou d'autres lignes/lignes spécifiques. Que faire si vous cherchez un moyen d'éviter les enregistrements en double dans SQL ? Utiliser la condition WHERE serait la solution.

Encore une fois, la syntaxe est la même dans 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);

Rien d'extraordinaire ici, mais la prochaine section sera différente.

3. LIMITE DE SUPPRESSION MySQL

LIMITE? Quelle LIMITE ?

LIMIT est équivalent à TOP dans T-SQL. Avant d'avoir un exemple DELETE, interrogeons les enregistrements que nous allons supprimer. Découvrez le code ci-dessous :

SELECT * FROM episodes
WHERE year(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo
LIMIT 2;

Voici votre LIMITE. Il en résultera 2 enregistrements, comme illustré à la figure 3 pour la vue de la carte dans dbForge Studio pour MySQL :

Maintenant, essayons de les supprimer. Jetez un œil à l'exemple ci-dessous :

DELETE FROM episodes
WHERE year(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo
LIMIT 2;

Avant de supprimer 2 épisodes, MySQL a interrogé tous les épisodes de 1987. Ensuite, il les a triés en numéros de saison et d'épisode. Enfin, il a limité les résultats à 2 enregistrements. C'est également une méthode appropriée lorsque nous devons supprimer des lignes en double. Cela nous permet de spécifier les conditions de suppression et de nous assurer que nous ne supprimerons rien de nécessaire (mais faire une sauvegarde garantirait toujours la sécurité des données).

Existe-t-il un équivalent T-SQL ? Pensez-vous que cela fonctionnera ?

DELETE TOP (2) FROM episodes
WHERE year(AirDate) = 2020
ORDER BY SeasonNo, EpisodeNo
GO

Si vous collez le code ci-dessus dans SQL Server Management Studio, vous obtiendrez des lignes sinueuses dans la clause ORDER BY. Pourtant, TOP est autorisé.

Si vous supprimez la clause ORDER BY, votre requête supprimera 2 enregistrements aléatoires. Enfin, le code ci-dessus ne fonctionnera pas comme prévu.

Pour avoir le même résultat qu'en MySQL, il vous faut le code suivant :

DELETE FROM episodes
WHERE EpisodeID IN
(SELECT TOP 2 EpisodeID FROM Episodes
 WHERE YEAR(AirDate) = 1987
 ORDER BY SeasonNo, EpisodeNo)

C'est un peu plus long en T-SQL qu'en MySQL. Mais il y a plus.

4. SUPPRIMER MySQL avec JOIN

Une autre façon de supprimer des enregistrements consiste à l'utiliser avec un JOIN qui filtrera les enregistrements que vous souhaitez supprimer. Comme de nombreux utilisateurs le définissent, il s'agit de la tâche MySQL delete join. Rien ne semble différent lorsque vous n'utilisez pas d'alias de table. Vérifiez l'exemple ci-dessous :

DELETE episodes
FROM episodes
INNER JOIN titles ON titles.TitleID = episodes.TitleID
WHERE titles.TitleID = 3
AND episodes.SeasonNo = 3;

Cela fonctionnera également dans T-SQL. Mais si nous utilisons un alias de table comme celui-ci :

DELETE episodes
FROM episodes e
INNER JOIN titles t ON t.TitleID = e.TitleID
WHERE t.TitleID = 3
AND e.SeasonNo = 3;

MySQL renverra une erreur. La syntaxe correcte est ci-dessous :

DELETE e
FROM episodes e
INNER JOIN titles t ON t.TitleID = e.TitleID
WHERE t.TitleID = 3
AND e.SeasonNo = 3;

Notez la différence !

5. Supprimer la sous-requête dans MySQL

Enfin, nous essayons d'utiliser des sous-requêtes. Il s'agit d'une autre façon de filtrer les enregistrements que vous souhaitez supprimer. Vous avez déjà vu l'exemple un peu plus tôt, mais reprenons :

DELETE FROM episodes
WHERE EpisodeID IN
(SELECT TOP 2 EpisodeID FROM Episodes
 WHERE YEAR(AirDate) = 1987
 ORDER BY SeasonNo, EpisodeNo)

C'est une syntaxe parfaitement valide dans T-SQL. Mais cela fonctionnera-t-il dans MySQL? Modifions-le légèrement :

DELETE FROM episodes
WHERE EpisodeID IN
(SELECT EpisodeID FROM Episodes
 WHERE YEAR(AirDate) = 1987
 ORDER BY SeasonNo, EpisodeNo
 LIMIT 2);

Oups! On dirait qu'on a touché le mur. Voici ce que dit MySQL :

Cette version de MySQL ne prend pas encore en charge la sous-requête "LIMIT &IN/ALL/ANY/SOME"

Et si nous supprimions le mot clé LIMIT ? Cela déclenche une autre erreur :

Vous ne pouvez pas spécifier la table cible "épisodes" pour une mise à jour dans la clause FROM.

Y at-il un travail autour? Changer le code en une sous-requête imbriquée fonctionnera très bien :

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)

Ça devrait le faire. Mais prenons un exemple plus sensé :

DELETE FROM episodes
WHERE TitleID IN
(SELECT TitleID FROM titles
 WHERE `From` BETWEEN 1995 AND 2000);

Maintenant, quel est le problème avec ces exemples ? Voyons :

  1. MySQL n'acceptera pas l'instruction DELETE avec un filtre de sous-requête utilisant le mot-clé LIMIT. Pas encore.
  2. MySQL n'acceptera pas DELETE de la table cible égale à la table de sous-requête qui la filtre.

[sendpulse-form id="13566″]

Conclusion

Jusqu'ici tout va bien. Vous avez trois comparaisons de syntaxe DELETE pour MySQL et T-SQL. J'espère que le troisième versement vous sera également utile à l'avenir.

Ce message a mis en évidence la syntaxe MySQL lors de la suppression

  • Tous les enregistrements,
  • 1 ou plusieurs enregistrements avec une clause WHERE,
  • En utilisant LIMIT,
  • En utilisant JOIN,
  • Utiliser des sous-requêtes.

Vous pouvez facilement voir les performances de la tâche de suppression de colonne MySQL ou supprimer n'importe quelle ligne, plusieurs lignes et des enregistrements spécifiques par conditions.

Si vous avez aimé cet article, n'hésitez pas à le partager sur vos plateformes de médias sociaux préférées. Dites-nous également ce que vous en pensez dans la section Commentaires ci-dessous.