如何将 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
,但不一定是UNIQUE
或PRIMARY 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 添加到现有列?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 SUPER 列添加到现有 AWS Redshift 表?
将 varbinary 更新到现有 SQL 列(添加到现有图像)?