如何在已有表格中添加唯一键(包含非唯一行)

88
我想给现有的表添加复杂的唯一键。该键包含4个字段 (user_id, game_id, date, time)。但是表中存在非唯一行。 我知道可以删除所有重复的日期,然后再添加复杂的键。
也许存在另一种解决方案,而不需要搜索所有重复的数据。(例如添加unique ignore等)
更新 我搜索了如何删除mysql重复行-我认为这是一个很好的解决方案。 Remove duplicates using only a MySQL query?

2
如果您创建了唯一键,则不允许存在重复项。 - Tchoupi
8个回答

162

你可以按照yAnTar的建议去做

ALTER TABLE TABLE_NAME ADD Id INT AUTO_INCREMENT PRIMARY KEY

您可以添加约束条件

ALTER TABLE TABLE_NAME ADD CONSTRAINT constr_ID UNIQUE (user_id, game_id, date, time)

但我认为为了不丢失您现有的数据,您可以添加一个标识列,然后创建一个复合键。


2
什么是IDENTITY列?除了与AUTO_INCREMENT相关的内容外,我在文档中找不到任何关于它的参考:http://dev.mysql.com/doc/refman/5.7/en/example-auto-increment.html - challet
4
正如 @challet 所提到的,MySQL 中的关键词不是 IDENTITY 而是 AUTO_INCREMENT。详情请参考 http://dev.mysql.com/doc/refman/5.7/en/example-auto-increment.html。 - MER
1
为了清晰起见,mysql语法是: ALTER TABLE TABLE_NAME ADD Id INT AUTO_INCREMENT PRIMARY KEY - Brett Sutton
OP没有(明确)指定特定的数据库。IDENTITY是MS / Oracle SQL-Server以及其他非MySQL / MariaDB方言的正确语法,对于它们,请使用AUTO_INCREMENT语法。 - fcm
2
该问题已标记为“mysql”,因此解决方案应适用于该数据库管理系统。 - Andrew Lalis

33

正确的语法应该是 - ALTER TABLE 表名 ADD UNIQUE (列名)

示例

ALTER TABLE  0_value_addition_setup ADD UNIQUE (`value_code`)

17
尽管这段代码可能有助于解决问题,但它并没有解释它为什么和/或如何回答这个问题。提供这种额外的上下文会显著提高它的长期教育价值。请编辑您的答案以添加解释,包括应用哪些限制和假设。 - Toby Speight
1
如果没有重复条目,则标记该列为唯一。如果有重复,则会出现“Duplicate entry 'my_value' for key 'my_key'”错误。 - Fanky
这不是MySQL网站上100%正确的语法。 - undefined

11

我曾经也遇到一个类似的问题。我继承了一个来自MS Access的大型源表,其中有近15000条记录没有主键,我必须将其规范化并使其兼容CakePHP。CakePHP的一个惯例是每个表都有主键,它是第一列,并且被称为“id”。以下简单语句在MySQL 5.5下为我解决了这个问题:

ALTER TABLE `database_name`.`table_name` 
ADD COLUMN `id` INT NOT NULL AUTO_INCREMENT FIRST,
ADD PRIMARY KEY (`id`);

这在现有数据(“FIRST”关键字)前面添加了一个类型为整数的新列'id'。AUTO_INCREMENT关键字从1开始递增id。现在每个数据集都有一个唯一的数字id。(如果没有AUTO_INCREMENT语句,所有行都将填充id = 0)。


3

在你的业务逻辑上作出假设,我将提供自己的解决方案。在我的设计中,我将允许表格仅存储用户-游戏组合的一条记录。因此,我将向表格添加一个复合关键字。

PRIMARY KEY (`user_id`,`game_id`)

3
在表中设置多个唯一键。
ALTER TABLE table_name
ADD CONSTRAINT UC_table_name UNIQUE (field1,field2);

2

可以创建一个自动递增的id或者一个唯一的id,并将其添加到你所说的具有4个字段的自然键中。这将使表中的每一行都是唯一的...


0

对于MySQL:

ALTER TABLE MyTable ADD MyId INT AUTO_INCREMENT PRIMARY KEY;

0
如果你的列名(yourColumnName)有一些不唯一的值,并且现在你想为它添加一个唯一索引。请尝试以下方法:
CREATE UNIQUE INDEX [IDX_Name] ON yourTableName (yourColumnName) WHERE [id]>1963 --1963 is max(id)-1

现在,尝试插入一些已存在的值进行测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接