如何将AUTO_INCREMENT添加到现有列?


Answers:


111

我认为您想MODIFY按照ALTER TABLE命令中的说明进行操作。可能是这样的:

ALTER TABLE users MODIFY id INTEGER NOT NULL AUTO_INCREMENT;

在上面运行之前,请确保该id列具有主索引。


9
可能还希望包括当前列值作为偏移量,例如ALTER TABLE tbl AUTO_INCREMENT = 100;
Phil

17
如果表中已经有值,则可能会得到一个重复的键错误,其值为1。要更改AUTO_INCREMENT的值,该表必须使用MyISAM引擎。因此,转到表属性,将引擎从InnoDB更改为MyISAM,然后将AUTO_INCREMENT值更改为序列中的下一个内容。应用这些更改后,您可以将引擎切换回您使用的任何位置。
2011年


17

在向具有数据的表中添加AUTO_INCREMENT的方法同时避免“重复输入”错误:

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

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

    TRUNCATE TABLE originalTable;
    
  3. 添加AUTO_INCREMENTPRIMARY KEY

    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. 删除backupTable:

    DROP TABLE backupTable;
    

我希望这是有用的!

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

复制MySQL表,索引和数据


如果您有一个大表...或者您想做点更聪明的事情,则将步骤1替换为:CREATE TABLE backupTable LIKE originalTable; 重命名表originalTable为originalTable.old,backupTable为originalTable;跳过第2步,否则您将丢失所有数据。
Tim Martens

1
这对我来说非常危险,因为记录很容易以不同于其开头的ID号结尾。如果其他表具有外键,originalTable或者您出于其他原因关心ID号,那么我认为您不想使用此方法。
唐·柯比

@DonKirkby感谢您指出这一点。不太可能将非唯一的id列与外键结合使用,但是您是对的。这种方法正是这样做的。它重建(或创建)所有id使其唯一。
阿里安·阿科斯塔

这是一个问题,因为在TRUNCATE期间使用数据的任何行为都会看到意外的行为
KeatsKelleher

14
Alter table table_name modify column_name datatype(length) AUTO_INCREMENT PRIMARY KEY

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


5
但是,如果该列已经是主键,则会出现类似“错误1068(42000):定义了多个主键”的错误。
Manish Bansal

6

只需在列或MODIFY COLUMN中添加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值(您不会这样做),但除此之外,它也一样。
瑞克·詹姆斯

4

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

1.)将整个表导出为.sql文件
2.)导出后删除表
2.)需要在CREATE_TABLE命令中进行更改
3.)从.sql文件执行了CREATE_TABLE和INSERT_INTO命令
... et viola


您保存了我的一天
nonabhai

1

我设法用下面的代码做到这一点:

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

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

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


FIRST是一个很好的约定,但这不是必需的。在(11)不执行任何操作,除非你也有ZEROFILL; 不要理会它。
瑞克·詹姆斯

0

Alter table table_name modify table_name.column_name data_type AUTO_INCREMENT;

例如:

Alter table avion modify avion.av int AUTO_INCREMENT;


欢迎使用SO,您的答案已经存在。请格式化您的源代码并进行解释!
cSteusloff

0

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


0

第一列中有现有数据,它们是0。首先,我将第一列设置为可空。然后,我将列的数据设置为null。然后,我将该列设置为索引。然后,我将其设为打开自动递增功能的主键。这是我上面其他人回答的地方:

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

这将数字添加到该表的所有行(从1开始)。如果我先运行上面的代码,那是行不通的,因为所有值都是0。并且在使其自动递增之前还需要使其成为索引。接下来,我将该列作为主键。


您可能曾经使用过SET sql_mode='NO_AUTO_VALUE_ON_ZERO';,如果由于某种原因有多个零而无法使用,则可以使用行计数器将所有行显式设置为新数字。
mpen

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.