跳到主要内容

三十八、MySQL 处理重复数据

MySQL 数据表中可能存在重复的记录,它们的差别可能只是自增 id 不一样

有时候我们允许重复数据的存在,但有时候也需要删除这些重复的数据

防止表中出现重复数据

可以在MySQL 数据表中设置指定的字段为 PRIMARY KEY(主键) 或者 UNIQUE(唯一) 索引来保证数据的唯一性

比如我们创建一个没有主键也没有唯一索引的表 tbl_language,那么该表就会允许出现多条重复记录

CREATE TABLE IF NOT EXISTS tbl_language(
id INT UNSIGNED,
name VARCHAR(64) NOT NULL,
url VARCHAR(128) NOT NULL,
founded_at DATE
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

然后我们就可以重复的插入 N 多条一样的数据

MariaDB [souyunku]> DROP TABLE tbl_language;
Query OK, 0 rows affected (0.01 sec)
MariaDB [souyunku]>` CREATE TABLE IF NOT EXISTS tbl_language(
->` id INT UNSIGNED,
->` name VARCHAR(64) NOT NULL,
->` url VARCHAR(128) NOT NULL,
->` founded_at DATE
-> )ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Query OK, 0 rows affected (0.04 sec)
MariaDB [souyunku]>` INSERT INTO tbl_language (id,name,url,founded_at) VALUES (1,'Ruby','https://www.ruby-lang.org/','1996-12-25');
Query OK, 1 row affected (0.01 sec)
MariaDB [souyunku]>` INSERT INTO tbl_language (id,name,url,founded_at) VALUES (1,'Ruby','https://www.ruby-lang.org/','1996-12-25');
Query OK, 1 row affected (0.01 sec)
MariaDB [souyunku]>` INSERT INTO tbl_language (id,name,url,founded_at) VALUES (1,'Ruby','https://www.ruby-lang.org/','1996-12-25');
Query OK, 1 row affected (0.01 sec)
MariaDB [souyunku]> SELECT * FROM tbl_language;
+------+------+----------------------------+------------+
| id | name | url | founded_at |
+------+------+----------------------------+------------+
| 1 | Ruby | https://www.ruby-lang.org/ | 1996-12-25 |
| 1 | Ruby | https://www.ruby-lang.org/ | 1996-12-25 |
| 1 | Ruby | https://www.ruby-lang.org/ | 1996-12-25 |
+------+------+----------------------------+------------+
3 rows in set (0.00 sec)