我有一个包含大量行(大约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设置为列id
的列值吗?
请注意:这必须通过查询完成,因为我无法手动更改10000行。
答案 0 :(得分:4)
你需要同时将它设置为AUTO_INCREMENT,这将填充它;
ALTER TABLE momento_distribution
ADD id INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
演示here。
编辑:如果你有一个现有的主键,你需要同时删除它;
ALTER TABLE momento_distribution
DROP PRIMARY KEY,
ADD id INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
答案 1 :(得分:2)
同一用户提出的同样问题不同。请参阅该问题。
MySQL 1062 - Duplicate entry '0' for key 'PRIMARY'
简而言之, 1.删除现有的FK 2.删除现有的PK 3.以
运行您的第一个查询ALTER TABLE `momento_distribution` ADD `id` INT( 11 ) PRIMARY KEY AUTO_INCREMENT NOT NULL FIRST;
也将分配唯一编号而不依赖于@rowid 4.如果需要,将FK添加到较早的列。