MySQLi – 处理重复
MySQLi – 处理重复
表或结果集有时包含重复记录。有时,这是允许的,但有时需要停止重复记录。有时,需要识别重复记录并将其从表中删除。本章将介绍如何防止表中出现重复记录以及如何删除已存在的重复记录。
防止表中出现重复项
您可以在具有适当字段的表上使用PRIMARY KEY或UNIQUE索引来停止重复记录。让我们举一个例子:下表不包含这样的索引或主键,因此它会允许 first_name 和 last_name 的重复记录。
CREATE TABLE person_tbl ( first_name CHAR(20), last_name CHAR(20), sex CHAR(10) );
要防止在此表中创建多个具有相同名字和姓氏值的记录,请将 PRIMARY KEY 添加到其定义中。执行此操作时,还需要将索引列声明为 NOT NULL,因为 PRIMARY KEY 不允许 NULL 值 –
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) );
如果在表中插入一条记录与定义索引的一列或多列中的现有记录重复,则表中存在唯一索引通常会导致发生错误。
使用INSERT IGNORE而不是INSERT。如果一条记录没有复制现有记录,MySQL 会像往常一样插入它。如果记录是重复的,则 IGNORE 关键字告诉 MySQL 将其静默丢弃而不产生错误。
以下示例不会出错,同时不会插入重复记录。
mysql> INSERT IGNORE INTO person_tbl (last_name, first_name) → VALUES( 'Jay', 'Thomas'); Query OK, 1 row 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)
使用REPLACE而不是 INSERT。如果记录是新的,它会像 INSERT 一样插入。如果它是重复的,新记录将替换旧记录 –
mysql> REPLACE INTO person_tbl (last_name, first_name) → VALUES( 'Ajay', 'Kumar'); Query OK, 1 row affected (0.00 sec) mysql> REPLACE INTO person_tbl (last_name, first_name) → VALUES( 'Ajay', 'Kumar'); Query OK, 2 rows affected (0.00 sec)
应根据您想要影响的重复处理行为选择 INSERT IGNORE 和 REPLACE。INSERT IGNORE 保留一组重复记录中的第一个并丢弃其余记录。REPLACE 保留一组重复项中的最后一个,并删除任何较早的重复项。
另一种强制唯一性的方法是向表添加 UNIQUE 索引而不是 PRIMARY KEY。
CREATE TABLE person_tbl ( first_name CHAR(20) NOT NULL, last_name CHAR(20) NOT NULL, sex CHAR(10) UNIQUE (last_name, first_name) );
计数和识别重复项
以下是对表中具有 first_name 和 last_name 的重复记录进行计数的查询。
mysql> SELECT COUNT(*) as repetitions, last_name, first_name → FROM person_tbl → GROUP BY last_name, first_name → HAVING repetitions > 1;
此查询将返回 person_tbl 表中所有重复记录的列表。通常,要识别重复的值集,请执行以下操作 –
-
确定哪些列包含可能重复的值。
-
在列选择列表中列出这些列,以及 COUNT(*)。
-
也列出 GROUP BY 子句中的列。
-
添加一个 HAVING 子句,该子句通过要求组计数大于 1 来消除唯一值。
从查询结果中消除重复项:
您可以将DISTINCT与 SELECT 语句一起使用来查找表中可用的唯一记录。
mysql> SELECT DISTINCT last_name, first_name → FROM person_tbl → ORDER BY last_name;
DISTINCT 的替代方法是添加一个 GROUP BY 子句来命名您选择的列。这具有删除重复项并仅选择指定列中值的唯一组合的效果 –
mysql> SELECT last_name, first_name → FROM person_tbl → GROUP BY (last_name, first_name);
使用表替换删除重复项
如果您在表中有重复记录并且想要从该表中删除所有重复记录,那么这里是过程 –
mysql> CREATE TABLE tmp SELECT last_name, first_name, sex → FROM person_tbl; → GROUP BY (last_name, first_name); mysql> DROP TABLE person_tbl; mysql> ALTER TABLE tmp RENAME TO person_tbl;
从表中删除重复记录的一种简单方法是向该表添加 INDEX 或 PRIMAY KEY。即使此表已经可用,您也可以使用此技术删除重复记录,并且将来也很安全。
mysql> ALTER IGNORE TABLE person_tbl → ADD PRIMARY KEY (last_name, first_name);