如何将 AUTO_INCREMENT 添加到现有列?

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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 值更改为序列中的下一个值。应用这些更改后,您可以将引擎切换回您使用的任何位置。 ***.com/questions/1485668/…【参考方案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添加到有数据的表中同时避免“重复条目”错误的方法:

    使用 INSERT SELECT 复制表数据:

    CREATE TABLE backupTable LIKE originalTable; 
    INSERT backupTable SELECT * FROM originalTable;
    

    从 originalTable 中删除数据(以删除重复条目):

    TRUNCATE TABLE originalTable;
    

    添加AUTO_INCREMENT 主键

    ALTER TABLE originalTable ADD id INT PRIMARY KEY AUTO_INCREMENT;
    

    将数据复制回 originalTable(不要包含新创建的列 (id),因为它会自动填充)

    INSERT originalTable (col1, col2, col3) 
    SELECT col1, col2,col3
    FROM backupTable;
    

    删除备份表:

    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 还是什么?

以上是关于如何将 AUTO_INCREMENT 添加到现有列?的主要内容,如果未能解决你的问题,请参考以下文章

如何将列添加到现有表?

如何将标识属性添加到 SQL Server 中的现有列

如何将 SUPER 列添加到现有 AWS Redshift 表?

将 varbinary 更新到现有 SQL 列(添加到现有图像)?

如何将新列添加到现有表 symfony - orocommerce

如何将具有值的新列添加到现有数据表?