Mysql - 使用唯一索引防止组合列的重复条目

标签 mysql

我遇到数据库中重复条目的问题,由于问题的性质,解决该问题的最简单方法是删除当前的重复行并防止添加更多重复项。

这是表结构:

| a     | b      |  c | 

 user    url1      token1
 photo   url1      token2
 action  action1   token3 
 user    url1      token4   
 photo   url1      token5
 action  action2   token6 

我想仅当 2 列重复时才防止重复条目,在本例中为 a 和 b 。

所以这里我们有用户 | url1 和照片 | url1 重复两次。

当两列同时与另一行匹配时,我想防止添加任何进一步的重复项,但到目前为止我发现的查询将单独考虑每一列,并防止向其中任何列添加任何进一步的重复项。

我可以通过使用唯一索引的 mysql 查询来实现这一点吗?

我尝试使用以下代码:

Using ALTER TABLE `targets` ADD UNIQUE (
`a` ,
`b`
);

最佳答案

您的问题:“我可以通过使用唯一索引的 mysql 查询来实现此目的吗?

答案是 100% 是。

创建索引有两种方式:

1. CREATE UNIQUE INDEX index_name
ON table_name (column1, column2, ...);

2. ALTER TABLE table_name 
ADD UNIQUE index_name (column1, column2, ...);

但是,只有当您的表不存在重复数据时,这才有效。否则您将收到如下错误消息:

Query: CREATE UNIQUE INDEX index_name ON targets (a, b)

Error Code: 1062
Duplicate entry 'photo-url1' for key 'index_name'

因此,您需要:

  1. 创建一个与您的targets 表类似的新空表。
  2. 创建唯一索引。
  3. 插入忽略旧表中的数据。
  4. targets 重命名为 targets_old,将 targets_new 重命名为 targets

示例:

CREATE TABLE targets_new LIKE targets;

CREATE UNIQUE INDEX index_name
ON targets_new (a, b);

INSERT IGNORE INTO targets_new SELECT * FROM targets;

RENAME TABLE targets TO targets_old;
RENAME TABLE targets_new TO targets;

关于Mysql - 使用唯一索引防止组合列的重复条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58092321/

相关文章:

mysql - 合并并更新sql中的表

php - 我想在报告评论后保持在同一页面上

mysql - mySQL 存储过程错误未知列

php - MYSQL InnoDB : LOAD DATA INFILE issue with Unique key

MySQL:VIEW 语句:使用 View 和聚合函数

Mysql 计算 3 个分组中的 2 个中的不同行

所有列的mySQL长度

MySQL group by 和 max 返回错误的行

php - Cordova 使用 AngularJS 将数据发布到 Mysql 数据库不起作用

mysql - 列出属于 mysql 数据库的操作 - (SHOW PROCESSLIST)