MySQL - 处理重复项

通常,表或结果集有时包含重复记录.大多数情况下它是允许的,但有时需要停止重复记录.需要识别重复记录并将其从表中删除.本章将介绍如何防止表中出现重复记录以及如何删除已存在的重复记录.

防止表中发生重复

您可以在具有相应字段的表上使用 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计算重复记录的查询./p>

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或PRIMARY KEY.即使此表已经可用,您也可以使用此技术删除重复记录,以及将来也是安全的.

mysql> ALTER IGNORE TABLE person_tbl
   -> ADD PRIMARY KEY (last_name, first_name);