2

我有一个包含很多行(大约 10k 行)的现有表,其中两列作为主键,因为它充当其他两个表之间多对多关系的中间表。

对于新要求,我需要分配添加新列(例如id),该列必须是具有自动增量值的主键。我运行了以下查询:

ALTER TABLE  `momento_distribution` ADD  `id` INT( 11 ) NOT NULL FIRST;
ALTER TABLE  `momento_distribution` DROP PRIMARY KEY , ADD PRIMARY KEY (  `id` );

第一个查询成功运行,但第二个查询生成以下错误:

1062 - Duplicate entry '0' for key 'PRIMARY'

原因很明显,新列id的默认值是 0,主键不能有重复值。

现在,在我可以运行第二个查询之前,我需要为新列设置增量值,如 1,2,3...

我知道,在 Oracle 中,这可以通过 rowid 来完成。MySQL 也有其等效的@rowid。有人可以建议一个查询来将@rowid 设置为 column 的列值id吗?

请注意:这必须通过查询来完成,因为我无法手动更改 10000 行。

4

2 回答 2

4

You need to set it to AUTO_INCREMENT at the same time, that will populate it;

ALTER TABLE momento_distribution 
  ADD id INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;

Demo here.

EDIT: If you have an existing primary key, you'll need to drop that at the same time;

ALTER TABLE momento_distribution 
  DROP PRIMARY KEY, 
  ADD id INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
于 2012-08-29T16:58:44.653 回答
2

同一用户提出的相同问题不同。参考那个问题。

MySQL 1062 - 键 'PRIMARY' 的重复条目 '0'

简而言之,1. 删除现有的 FK 2. 删除现有的 PK 3. 运行您的第一个查询

ALTER TABLE  `momento_distribution` ADD  `id` INT( 11 ) PRIMARY KEY AUTO_INCREMENT NOT NULL FIRST;

这也将分配唯一编号而不依赖于@rowid 4. 如果需要,将 FK 添加到较早的列。

于 2012-08-30T04:31:18.163 回答