【问题标题】:How to add AUTO_INCREMENT to an existing column?如何将 AUTO_INCREMENT 添加到现有列?
【发布时间】:2011-06-29 11:32:51
【问题描述】:

如何将auto_increment 添加到 MySQL 表的现有列中?

【问题讨论】:

    标签: mysql auto-increment


    【解决方案1】:

    我想你想MODIFY 列,就像为ALTER TABLE command 描述的那样。可能是这样的:

    ALTER TABLE users MODIFY id INTEGER NOT NULL AUTO_INCREMENT;
    

    在上面运行之前确保id 列有一个主索引。

    【讨论】:

    • 可能还想包含当前列值作为偏移量,例如ALTER TABLE tbl AUTO_INCREMENT = 100;
    • 如果表中已有值,您可能会收到值为 1 的重复键错误。要更改 AUTO_INCREMENT 的值,表必须使用 MyISAM 引擎。所以转到表属性,将引擎从 InnoDB 更改为 MyISAM,然后将 AUTO_INCREMENT 值更改为序列中的下一个值。应用这些更改后,您可以将引擎切换回您使用的任何位置。
    【解决方案2】:
    Alter table table_name modify column_name datatype(length) AUTO_INCREMENT PRIMARY KEY
    

    你应该添加主键来自动递增,否则你会在mysql中出错。

    【讨论】:

    • 但是如果列已经是主键,你会得到类似“ERROR 1068 (42000): Multiple primary key defined”的错误。
    【解决方案3】:

    如果您想更改非空表的 AUTO_INCREMENT 属性,这对我有用:

    1.) 将整个表导出为 .sql 文件
    2.)导出后删除表
    2.) CREATE_TABLE 命令是否需要更改
    3.)从 .sql 文件执行 CREATE_TABLE 和 INSERT_INTO 命令
    ...等中提琴

    【讨论】:

      【解决方案4】:

      只需在列或修改列中添加 auto_increment 约束:-

       ALTER TABLE `emp` MODIFY COLUMN `id` INT NOT NULL UNIQUE AUTO_INCREMENT FIRST;
      

      或者先添加一列,然后将列更改为-

      1. Alter TABLE `emp` ADD COLUMN `id`;
      
      2. ALTER TABLE `emp` CHANGE COLUMN `id` `Emp_id` INT NOT NULL UNIQUE AUTO_INCREMENT FIRST;
      

      【讨论】:

      • id 列需要INDEX,但不一定是UNIQUEPRIMARY KEY。一个普通的 INDEX 将允许您手动添加一个 dup 值(您不会这样做),但除此之外,它也一样好。
      【解决方案5】:

      将AUTO_INCREMENT添加到有数据的表中同时避免“重复条目”错误的方法:

      1. 使用 INSERT SELECT 复制表数据:

        CREATE TABLE backupTable LIKE originalTable; 
        INSERT backupTable SELECT * FROM originalTable;
        
      2. 从 originalTable 中删除数据(以删除重复条目):

        TRUNCATE TABLE originalTable;
        
      3. 添加AUTO_INCREMENT 主键

        ALTER TABLE originalTable ADD id INT PRIMARY KEY AUTO_INCREMENT;
        
      4. 将数据复制回 originalTable(不要包含新创建的列 (id),因为它会自动填充)

        INSERT originalTable (col1, col2, col3) 
        SELECT col1, col2,col3
        FROM backupTable;
        
      5. 删除备份表:

        DROP TABLE backupTable;
        

      希望对你有用!

      更多关于使用 CREATE LIKE 复制表的信息:

      Duplicating a MySQL table, indexes and data

      【讨论】:

      • 如果你有一张大桌子......或者你想做一些更聪明的事情,将步骤 1 替换为: CREATE TABLE backupTable LIKE originalTable;将表 originalTable 重命名为 originalTable.old,将备份表重命名为 originalTable;跳过第 2 步,否则您将丢失所有数据。
      • 这对我来说看起来很危险,因为记录很容易以与开始时不同的 ID 号结束。如果其他表有originalTable的外键或者你因为其他原因关心id号,那么我认为你不想使用这种方法。
      • @DonKirkby 感谢您指出这一点。非唯一 id 列不太可能与外键一起使用,但您是对的。这种方法正是这样做的。它重建(或创建)所有 id 以使其唯一。
      • 这是一个问题,因为在 TRUNCATE 期间使用数据的任何内容都会出现意外行为
      【解决方案6】:

      我设法用以下代码做到了这一点:

      ALTER TABLE `table_name`
      CHANGE COLUMN `colum_name` `colum_name` INT(11) NOT NULL AUTO_INCREMENT FIRST;
      

      这是我可以使列自动递增的唯一方法。

      INT(11) 表示最大 int 长度为 11,如果需要,可以跳过。

      【讨论】:

      • FIRST 是一个很好的约定,但这不是必需的。 (11) 什么都不做,除非你也有 ZEROFILL;不要费心指定它。
      【解决方案7】:

      Alter table table_name modify table_name.column_name data_type AUTO_INCREMENT;

      例如:

      Alter table avion modify avion.av int AUTO_INCREMENT;

      【讨论】:

      • 欢迎来到 SO,您的答案已经存在。请格式化您的源代码并解释!
      • 这个答案适用于我已经有主键列约束的现有表。
      【解决方案8】:
      ALTER TABLE Table name ADD column datatype AUTO_INCREMENT,ADD primary key(column);
      

      【讨论】:

      • 你确定吗? OP 大约在八年前询问(!)如何修改 existing
      • 对不起,他问如何修改现有的列,你的回答没有意义!
      【解决方案9】:

      如果您有 FK 约束并且您不想从表中删除约束。使用“索引”而不是主要的。那么您将能够将其类型更改为自动递增

      【讨论】:

        【解决方案10】:

        我在第一列中有现有数据,它们是 0。 首先,我使第一列可以为空。 然后我将列的数据设置为空。 然后我将该列设置为索引。 然后我将其设为主键,并启用了自动递增功能。这是我在上面使用另一个人的答案的地方:

        ALTER TABLE `table_name` CHANGE COLUMN `colum_name` `colum_name` INT(11) NOT NULL AUTO_INCREMENT FIRST;
        

        这从一开始为该表的所有行添加了数字。如果我先运行上面的代码,它就不起作用,因为所有的值都是 0。在使其自动递增之前,还需要将其设为索引。 接下来我将该列设为主键。

        【讨论】:

        • 您可以使用SET sql_mode='NO_AUTO_VALUE_ON_ZERO'; 如果由于某种原因由于您有多个零而这不起作用,您可以使用行计数器将所有行显式设置为新数字。
        【解决方案11】:

        这在我的情况下有效,如果你想将列属性更改为已经有一些数据的自动增量

        1.转到结构,选择要更改的列。 2.选择列后,从下面的选项中选择主键。 [1]:https://i.stack.imgur.com/r7w8f.png 3.然后使用alter方法将列属性更改为自增

        【讨论】:

        • 是 PhpMyAdmin 还是什么?
        猜你喜欢
        • 1970-01-01
        • 2011-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-15
        • 2019-08-11
        • 2015-05-30
        相关资源
        最近更新 更多