English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Certains tables MySQL peuvent contenir des enregistrements répétés, dans certains cas, nous autorisons l'existence de données répétées, mais parfois, nous avons également besoin de supprimer ces données répétées.
Dans cette section, nous vous expliquerons comment éviter l'apparition de données répétées dans les tables de données et comment supprimer les données répétées dans les tables de données.
Vous pouvez définir un champ spécifique dans une table MySQL comme PRIMARY KEY (clé primaire) ou UNIQUE (unique) Les index garantissent l'unicité des données.
Essayons un exemple : dans le tableau suivant, il n'y a pas d'index ni de clé primaire, donc le tableau permet l'apparition de multiples enregistrements répétés.
CREATE TABLE person_tbl ( first_name CHAR(20), last_name CHAR(20), sex CHAR(10) );
Si vous souhaitez définir que les données des champs first_name, last_name dans la table ne peuvent pas être répétées, vous pouvez configurer le mode clé primaire double pour définir l'unicité des données. Si vous avez configuré une clé primaire double, alors la valeur par défaut de cette clé ne peut pas être NULL, et peut être définie comme NOT NULL. Voici un exemple :
CREATE TABLE person_tbl ( first_name CHAR(20) NOT NULL, last_name CHAR(20) NOT NULL, sex CHAR(10), PRIMARY KEY (last_name, first_name) );
Si nous avons configuré un index unique, alors lors de l'insertion de données répétées, l'instruction SQL ne peut pas être exécutée avec succès et une erreur est générée.
La différence entre INSERT IGNORE INTO et INSERT INTO réside dans le fait que INSERT IGNORE INTO ignore les données existantes dans la base de données. Si la base de données n'a pas de données, elle insère de nouvelles données, et si elle en a, elle saute cette ligne de données. De cette manière, les données existantes dans la base de données peuvent être conservées, atteignant ainsi l'objectif d'insertion de données dans les lacunes.
L'exemple suivant utilise INSERT IGNORE INTO, après exécution, il ne se produira pas d'erreur et les données répétées ne seront pas insérées dans la table de données :
mysql> INSERT IGNORE INTO person_tbl (last_name, first_name) -> VALUES('Jay', 'Thomas'); Query OK 1 rows affected (0.00 sec) mysql> INSERT IGNORE INTO person_tbl (last_name, first_name) -> VALUES('Jay', 'Thomas'); Query OK, 0 rows affected (0.00 sec)
INSERT IGNORE INTO lors de l'insertion de données, après avoir défini l'unicité des enregistrements, si des données répétées sont insérées, aucune erreur ne sera retournée, mais un avertissement sera simplement renvoyé. Tandis que REPLACE INTO supprime d'abord les enregistrements primaires ou uniques existants avant d'insérer un nouveau enregistrement si un enregistrement identique existe.
Une autre méthode pour définir l'unicité des données consiste à ajouter un index UNIQUE, comme suit :
CREATE TABLE person_tbl ( first_name CHAR(20) NOT NULL, last_name CHAR(20) NOT NULL, sex CHAR(10), UNIQUE (last_name, first_name) );
Nous allons maintenant compter le nombre d'enregistrements répétés pour first_name et last_name dans la table :
mysql> SELECT COUNT(*) en tant que répétitions, last_name, first_name -FROM person_tbl -> GROUP BY last_name, first_name -> HAVING repetitions > 1;
La requête ci-dessus retournera le nombre de enregistrements répétés dans la table person_tbl. Généralement, pour interroger les valeurs répétées, effectuez les opérations suivantes :
déterminer quelles colonnes peuvent contenir des valeurs répétées.
Dans la liste de sélection des colonnes, utilisez COUNT(*) répertoriées.
les colonnes répertoriées dans la clause GROUP BY.
HAVING clause pour définir le nombre de répétitions supérieur à1.
Si vous avez besoin de lire des données non répétées, vous pouvez utiliser le mot-clé DISTINCT dans l'expression SELECT pour filtrer les données répétées.
mysql> SELECT DISTINCT last_name, first_name -> FROM person_tbl;
Vous pouvez également utiliser GROUP BY pour lire les données non répétées dans une table de données :
mysql> SELECT last_name, first_name -FROM person_tbl -GROUP BY (last_name, first_name);
Si vous souhaitez supprimer les données redondantes dans une table de données, vous pouvez utiliser la requête SQL suivante :
mysql> CREATE TABLE tmp SELECT last_name, first_name, sex FROM person_tbl GROUP BY (last_name, first_name, sex); mysql> DROP TABLE person_tbl; mysql> ALTER TABLE tmp RENAME TO person_tbl;
Bien sûr, vous pouvez également supprimer les enregistrements redondants dans une table de données en utilisant une méthode simple comme ajouter INDEX (index) et PRIMAY KEY (clé primaire). Voici comment faire :
mysql> ALTER IGNORE TABLE person_tbl -Ajouter PRIMARY KEY (last_name, first_name);