如何使列值的唯一组合?

cunj1qz1  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(299)

我有一张表,上面有这样的数据:

id |  link  |  name  | date 
 1     aa      bob      1
 1     aa      tom      2
 1     bb      tom      3
 2     cc      lora     4

这意味着我不能在任何列中有唯一的值,但我不能在同一行中有相同的值 id link name (日期无关紧要)。这就是我不能拥有的例子:

id |  link  |  name  |  date 
  1     aa       bob      1
  1     aa       bob      2

我试着:

ALTER TABLE table ADD UNIQUE KEY `uk_id_link_name` (id, link, name);

也:

ALTER TABLE `table` ADD UNIQUE `unique_index`(`id`, `link`, `name`);

但它给了我一个错误:
重复条目
如何生成唯一行(非唯一列值的组合)?
编辑:我不想从表中删除重复项。

xcitsw88

xcitsw881#

您的表已经违反了唯一约束。所以你需要摆脱那些令人不快的价值观。
您可以删除除最早日期以外的所有日期:

delete t
    from t join
         (select id, link, name, min(date) as mindate
          from t
          group by id, link, name
         ) tt
         using (id, link, name)
    where date > mindate;

当数据兼容时,可以添加唯一约束。
注意:在执行此操作之前备份/复制表,这样就不会丢失可能真正需要的数据。

mwkjh3gx

mwkjh3gx2#

sql server的正确语法如下:

ALTER TABLE TableName ADD CONSTRAINT ConstraintName UNIQUE (id, link, name)

但是在创建约束之前,您当然应该确保不存在约束的行,例如使用以下查询:

SELECT id, link, name, COUNT(*)
FROM TableName
GROUP BY id, link, name
HAVING COUNT(*) >= 2

此查询返回按以下三个字段分组的重复项:id、link、name
如果查询返回行,则必须在创建唯一约束之前解决这些重复项。

相关问题