74

我想向现有表添加复杂的唯一键。键包含 4 个字段 ( user_id, game_id, date, time)。但是表有非唯一的行。我知道我可以删除所有重复的日期,然后添加复杂的键。

也许存在另一种解决方案而不搜索所有重复数据。(如添加独特的忽略等)。

我搜索了 UPD,如何删除重复的 mysql 行 - 我认为这是一个很好的解决方案。 仅使用 MySQL 查询删除重复项?

4

8 回答 8

142

你可以按照 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)

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

于 2013-03-06T19:17:11.633 回答
27

正确的语法是 -ALTER TABLE Table_Name ADD UNIQUE (column_name)

例子

ALTER TABLE  0_value_addition_setup ADD UNIQUE (`value_code`)
于 2016-10-04T10:19:37.230 回答
10

我不得不解决一个类似的问题。我从 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)。

于 2013-12-31T13:24:07.407 回答
3

我正在为我的解决方案提供对您的业务逻辑的假设。基本上,在我的设计中,我将允许该表仅存储用户游戏组合的一条记录。所以我将向表中添加一个复合键。

PRIMARY KEY (`user_id`,`game_id`)
于 2013-03-06T20:39:24.723 回答
2

创建一个自动增量 id 或一个 UNIQUE id 并将其添加到您正在谈论的 4 个字段的自然键中。这将使表中的每一行都是唯一的......

于 2013-03-06T18:43:04.183 回答
1

将多个唯一键设置到表中

ALTER TABLE table_name
ADD CONSTRAINT UC_table_name UNIQUE (field1,field2);
于 2018-06-01T07:16:02.347 回答
0

如果 yourColumnName 的某些值不是唯一的,现在您想为其添加唯一索引。尝试这个:

CREATE UNIQUE INDEX [IDX_Name] ON yourTableName (yourColumnName) WHERE [id]>1963 --1963 is max(id)-1

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

于 2021-04-23T02:53:11.977 回答
0

对于 MySQL:

ALTER TABLE MyTable ADD MyId INT AUTO_INCREMENT PRIMARY KEY;
于 2019-07-15T20:12:22.590 回答