【问题标题】:make an ID in a mysql table auto_increment (after the fact)在 mysql 表 auto_increment 中创建一个 ID(事后)
【发布时间】:2010-09-20 01:42:31
【问题描述】:

我从另一个开发人员那里获得了一个数据库。他没有在任何表上使用 auto_incrementers。它们都有主键 ID,但他在代码中手动完成了所有递增操作。

我现在可以把它们变成 Auto_incrementers 吗?


哇,非常好,非常感谢。它在我的一张桌子上运行顺利。但是第二张表,我收到此错误...将 '.\DBNAME#sql-6c8_62259c' 重命名为 '.\DBNAME\dealer_master_events' 时出错

【问题讨论】:

    标签: mysql primary-key auto-increment


    【解决方案1】:

    例如,这里有一个主键但不是AUTO_INCREMENT 的表:

    mysql> CREATE TABLE foo (
      id INT NOT NULL,
      PRIMARY KEY (id)
    );
    mysql> INSERT INTO foo VALUES (1), (2), (5);
    

    您可以MODIFY 使用AUTO_INCREMENT 选项重新定义该列:

    mysql> ALTER TABLE foo MODIFY COLUMN id INT NOT NULL AUTO_INCREMENT;
    

    验证是否生效:

    mysql> SHOW CREATE TABLE foo;
    

    输出:

    CREATE TABLE foo (
      `id` INT(11) NOT NULL AUTO_INCREMENT,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=latin1
    

    请注意,您已就地修改了列定义,而无需创建第二列并删除原始列。 PRIMARY KEY 约束不受影响,您无需在 ALTER TABLE 语句中提及。

    接下来您可以测试插入是否生成新值:

    mysql> INSERT INTO foo () VALUES (); -- yes this is legal syntax
    mysql> SELECT * FROM foo;
    

    输出:

    +----+
    | id |
    +----+
    |  1 | 
    |  2 | 
    |  5 | 
    |  6 | 
    +----+
    4 rows in set (0.00 sec)
    

    我在 Mac OS X 上的 MySQL 5.0.51 上对此进行了测试。

    我还使用ENGINE=InnoDB 和一个依赖表进行了测试。修改id 列定义不会中断引用完整性。


    要回复您在评论中提到的错误 150,它可能与外键约束冲突。我很抱歉,在我测试它之后,我认为它会起作用。以下是一些可能有助于诊断问题的链接:

    【讨论】:

    • 哇,非常好,非常感谢。它在我的一张桌子上运行顺利。但是第二张表,我收到此错误...将“.\DBNAME\#sql-6c8_62259c”重命名为“.\DBNAME\dealer_master_events”时出错(错误号:150)
    • 如果主键已经在其他地方充当外键,则需要在运行 alter table 查询之前禁用外键检查。 set foreign_key_checks = 0; ALTER TABLE buyer MODIFY COLUMN _id INT NOT NULL AUTO_INCREMENT; set foreign_key_checks = 1;
    • @mugumedavid,这是不正确的。我刚试过。即使有从属表引用它,您也可以更改父表并使其主键 auto_increment。同样在另一个方向上,如果您想将 auto_increment 添加到也是 FK 的 PK(不知道为什么要这样做)。
    • @billkarwin 在我的情况下我真的失败了,这导致我进入这个页面和dba.stackexchange.com/questions/90162/… 这可能是我的数据库版本或 myIsam vs Innodb
    【解决方案2】:

    我猜你不需要重新增加现有数据所以你为什么不能运行一个简单的 ALTER TABLE 命令来更改 PK 的属性?

    类似:

    ALTER TABLE `content` CHANGE `id` `id` SMALLINT( 5 ) UNSIGNED NOT NULL AUTO_INCREMENT 
    

    我已经在我自己的 MySQL 数据库上测试了这段代码,它可以工作,但我没有尝试过任何有意义的记录数。更改行后,您需要将增量重置为保证不会干扰任何其他记录的数字。

    ALTER TABLE `content` auto_increment = MAX(`id`) + 1
    

    同样,未经测试,但我相信它会起作用。

    【讨论】:

    • 我认为不需要第二个ALTER。而且我认为它会失败,因为语法需要“值”,而不是“表达式”。
    【解决方案3】:

    以上都不适用于我的桌子。我有一个无符号整数作为主键的表,其值范围从 0 到 31543。目前有超过 19000 条记录。我不得不将列修改为AUTO_INCREMENT (MODIFY COLUMN'id'INTEGER UNSIGNED NOT NULL AUTO_INCREMENT) 并在同一语句中设置种子(AUTO_INCREMENT = 31544)。

    ALTER TABLE `'TableName'` MODIFY COLUMN `'id'` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT = 31544;
    

    【讨论】:

    • 这很关键,也是唯一对我有用的东西(MySQL 5.6/OSX)。如果您已经有一个 not 自动增量的主键并将其更改为自动增量,则您必须(至少在我的配置中,这是 100% 默认值)在同一语句中执行它们,否则插入不提供 ID 将失败,例如ERROR 1364 (HY000): Field 'id' doesn't have a default value.
    【解决方案4】:

    这对我有用(我想将 id 设为主要并设置自动增量)

    ALTER TABLE table_name CHANGE id id INT PRIMARY KEY AUTO_INCREMENT;

    【讨论】:

      【解决方案5】:
      ALTER TABLE `foo` MODIFY COLUMN `bar_id` INT NOT NULL AUTO_INCREMENT;
      

      ALTER TABLE `foo` CHANGE `bar_id` `bar_id` INT UNSIGNED NOT NULL AUTO_INCREMENT;
      

      但如果您的 bar_id 是另一个表中的外键,这些都不起作用:您将得到 ​​p>

      an error 1068: Multiple primary key defined
      

      为了解决这个问题,暂时禁用外键约束检查

      set foreign_key_checks = 0;
      

      在运行上述语句后,再次启用它们。

      set foreign_key_checks = 1;
      

      【讨论】:

        【解决方案6】:

        是的,很简单。只需运行数据定义查询来更新表,添加一个 AUTO_INCREMENT 列。

        如果您有一个现有的数据库,请注意保留“人为创建的”主键上可能已经存在的任何外键关系。

        【讨论】:

          【解决方案7】:

          只要您在当前 PK 中有唯一整数(或某些唯一值),您就可以创建一个新表,并在 IDENTITY INSERT ON 的情况下将其插入。然后删除旧表,并重命名新表。

          不要忘记重新创建任何索引。

          【讨论】:

          • 该选项特定于 Microsoft SQL Server,与 MySQL 无关。
          猜你喜欢
          • 2019-11-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-10
          • 2014-06-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多