【问题标题】:Assign MySQL @rowid as value将 MySQL @rowid 分配为值
【发布时间】:2012-08-24 08:29:39
【问题描述】:

我有一个现有的表,其中包含很多行(大约 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 行。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    您需要同时将其设置为 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;
    

    【讨论】:

    • 谢谢@Joachim。 +1 用于 SQL Fiddle 演示(我知道 JS Fiddle 但不知道 SQLFiddle)。这给了我信心。不幸的是,我当天离开了办公室。急切地等待在我的桌子上进行测试。再次感谢。
    • 对不起@Joachim,但它不起作用。我刚刚将主键添加到您的表中,例如 name VARCHAR(32) PRIMARY KEY,但它失败了。在我的情况下,我也已经有了现有的主键。
    • 用替换现有主键的语句编辑。 SQLFiddle 表只是一个示例表,用于展示alter 表是如何工作的,您想要的是上面的语句; ALTER TABLE momento_distribution DROP PRIMARY KEY, ADD id INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
    【解决方案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 添加到前面的列中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      • 2018-09-02
      相关资源
      最近更新 更多