我想向现有表添加复杂的唯一键。键包含 4 个字段 ( user_id
, game_id
, date
, time
)。但是表有非唯一的行。我知道我可以删除所有重复的日期,然后添加复杂的键。
也许存在另一种解决方案而不搜索所有重复数据。(如添加独特的忽略等)。
我搜索了 UPD,如何删除重复的 mysql 行 - 我认为这是一个很好的解决方案。 仅使用 MySQL 查询删除重复项?
我想向现有表添加复杂的唯一键。键包含 4 个字段 ( user_id
, game_id
, date
, time
)。但是表有非唯一的行。我知道我可以删除所有重复的日期,然后添加复杂的键。
也许存在另一种解决方案而不搜索所有重复数据。(如添加独特的忽略等)。
我搜索了 UPD,如何删除重复的 mysql 行 - 我认为这是一个很好的解决方案。 仅使用 MySQL 查询删除重复项?
你可以按照 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 列,然后创建一个复合键。
正确的语法是 -ALTER TABLE Table_Name ADD UNIQUE (column_name)
例子
ALTER TABLE 0_value_addition_setup ADD UNIQUE (`value_code`)
我不得不解决一个类似的问题。我从 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)。
我正在为我的解决方案提供对您的业务逻辑的假设。基本上,在我的设计中,我将允许该表仅存储用户游戏组合的一条记录。所以我将向表中添加一个复合键。
PRIMARY KEY (`user_id`,`game_id`)
创建一个自动增量 id 或一个 UNIQUE id 并将其添加到您正在谈论的 4 个字段的自然键中。这将使表中的每一行都是唯一的......
将多个唯一键设置到表中
ALTER TABLE table_name
ADD CONSTRAINT UC_table_name UNIQUE (field1,field2);
如果 yourColumnName 的某些值不是唯一的,现在您想为其添加唯一索引。尝试这个:
CREATE UNIQUE INDEX [IDX_Name] ON yourTableName (yourColumnName) WHERE [id]>1963 --1963 is max(id)-1
现在,尝试插入一些存在的值进行测试。
对于 MySQL:
ALTER TABLE MyTable ADD MyId INT AUTO_INCREMENT PRIMARY KEY;