将自动增量主键插入现有表


157

我正在尝试更改没有主键或auto_increment列的表。我知道如何添加主键列,但我想知道是否有可能自动将数据插入主键列(我已经在数据库中有500行,并希望为其提供ID,但我不想手动执行) 。有什么想法吗?非常感谢。


2
您可以轻松地执行操作alter table以添加密钥,但是MySQL不会为尚不存在的字段生成ID。您必须手动更新现有字段,然后确保新的auto_increment从正确的偏移量开始-默认为“ 1”,并且无论如何都会导致重复的键错误。
Marc B

3
@MarcB我刚刚测试过,实际上它的确插入了从1开始的现有行的ID
Michael

Answers:


253

在我的测试中,ALTER TABLE添加PRIMARY KEY列的语句可以正常工作:

ALTER TABLE tbl ADD id INT PRIMARY KEY AUTO_INCREMENT;

在为测试目的而创建的临时表上,以上语句创建了该AUTO_INCREMENT id列,并为表中的每个现有行插入了从1开始的自动增量值。


1
是的,这是我的经验。永远不要记得必须运行单独的脚本来填充auto_increment id ...
Mike Purcell

1
哈哈谢谢。我的错。绿色标记适合您,因为您的标记易于实施。:D
FlyingCat 2012年

53
要使其成为第一列,请使用FIRST例如ALTER TABLE tbl1 ADD id INT PRIMARY KEY AUTO_INCREMENT FIRST;
David Thomas

1
@Nikkie SQLite的机制完全不同。您可以在此处找到建议stackoverflow.com/questions/946011/sqlite-add-primary-key
Michael Berkowski

1
@WijaySharma如果您创建的行具有自动递增功能,并且必须立即通过id对其进行检索,则MySQL提供LAST_INSERT_ID()了该值,SELECT * FROM table_name WHERE id = LAST_INSERT_ID()并且大多数编程语言API提供了一些函数/方法来在应用程序代码中返回该值。
Michael Berkowski

51

假设您没有自动递增列,例如id,no,那么您可以使用以下查询进行添加:

ALTER TABLE table_name ADD id int NOT NULL AUTO_INCREMENT primary key FIRST

如果有列,则使用以下查询更改为自动递增:

 ALTER TABLE table_name MODIFY column_name datatype(length) AUTO_INCREMENT PRIMARY KEY

1
什么是FIRST在结束呢?
Dementic

1
它将使新id列成为表中的第一列,而不是最后一列,这是默认行为。
fmalina

工作不错!谢谢!
Majedur Ra​​haman

4

是的,这样的事情可能会做到,虽然可能不是最好的,但您可能想要备份

$get_query = mysql_query("SELECT `any_field` FROM `your_table`");

$auto_increment_id = 1;

while($row = mysql_fetch_assoc($get_query))
{
  $update_query = mysql_query("UPDATE `your_table` SET `auto_increment_id`=$auto_increment_id WHERE `any_field` = '".$row['any_field']."'");
  $auto_increment_id++;
}

请注意,any_field您选择的更新时必须相同。


4

对于像我这样的人,请Multiple primary key defined尝试:

ALTER TABLE `myTable` ADD COLUMN `id` INT AUTO_INCREMENT UNIQUE FIRST NOT NULL;

在MySQL v5.5.31上,这将id列设置为我的主键,并用递增值填充每一行。


2

我发现最简单,最快的方法是

ALTER TABLE mydb.mytable 
ADD COLUMN mycolumnname INT NOT NULL AUTO_INCREMENT AFTER updated,
ADD UNIQUE INDEX mycolumnname_UNIQUE (mycolumname ASC);

2

我能够按照以下说明进行调整:选择一个具有现有非递增主键的表,并向该表中添加一个递增主键,并使用以下命令创建一个新的组合主键,其中旧键和新键均作为组合主键码:

DROP TABLE  IF EXISTS SAKAI_USER_ID_MAP;

CREATE TABLE SAKAI_USER_ID_MAP (
       USER_ID             VARCHAR (99) NOT NULL,
       EID                 VARCHAR (255) NOT NULL,
       PRIMARY KEY (USER_ID)
);

INSERT INTO SAKAI_USER_ID_MAP VALUES ('admin', 'admin');
INSERT INTO SAKAI_USER_ID_MAP VALUES ('postmaster', 'postmaster');

ALTER TABLE  SAKAI_USER_ID_MAP 
  DROP PRIMARY KEY, 
  ADD _USER_ID INT AUTO_INCREMENT NOT NULL FIRST, 
  ADD PRIMARY KEY ( _USER_ID, USER_ID );

完成此操作后,_USER_ID字段将存在,并且具有与您期望的完全相同的主键的所有数字值。通过顶部的“ DROP TABLE”,您可以反复运行此程序以尝试各种变体。

我无法正常工作的情况是,传入的FOREIGN KEY已经指向USER_ID字段。当我尝试使用另一个表中的传入外键来做更复杂的示例时,会收到此消息。

#1025 - Error on rename of './zap/#sql-da07_6d' to './zap/SAKAI_USER_ID_MAP' (errno: 150)

我猜想我需要在做ALTER表之前先拆掉所有外键,然后再重建它们。但是目前,我想将这个解决方案与原始问题的更具挑战性的版本共享,以防其他人遇到这种情况。


0

导出表,然后清空表,然后将字段添加为唯一的INT,然后将其更改为AUTO_INCREMENT,然后再次导入先前导出的表。


0

您可以使用以下命令将新的“主键”列添加到现有表中,该表可以具有序列号:

ALTER TABLE mydb.mytable ADD pk_columnName INT IDENTITY 

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IDENTITY' at line 1
user1717828 '19

0

我遇到了同样的问题,所以我做了什么工作后就删除了主键字段,然后重新创建它并确保它是自动增量的。那对我有用。希望对别人有帮助


0

ALTER TABLE tableName修改tableNameID MEDIUMINT非空AUTO_INCREMENT ;

这里的tableName是表的名称,

tableName是您的列名,必须对其进行修改

MEDIUMINT是您现有主键的数据类型

AUTO_INCREMENT您必须在不为null后添加仅auto_increment

它将使主键自动递增......

希望这会有所帮助:)


1
如果您编辑并添加一些说明,将会很有用。
Shashanth

-1

如何编写PHP以更改已经存在的字段(在此示例中为name)以使其成为主键?当然,不带任何其他“ id”字段到表中。

当前创建的此表-找到的记录数:4名称VARCHAR(20)是品种VARCHAR(30)是颜色VARCHAR(20)是重量SMALLINT(7)是

寻求的最终结果(表说明)-

找到的记录数:4名称VARCHAR(20)否PRI品种VARCHAR(30)是颜色VARCHAR(20)是重量SMALLINT(7)是

而不是得到这个-

找到的记录数:5 id int(11)否PRI名称VARCHAR(20)是品种VARCHAR(30)是颜色VARCHAR(20)是重量SMALLINT(7)是

经过尝试..

$ query =“ ALTER TABLE赛马添加ID INT不为空AUTO_INCREMENT FIRST,添加主键(id)”;

怎么得到这个?--

找到的记录数:4名称VARCHAR(20)否PRI品种VARCHAR(30)是颜色VARCHAR(20)是重量SMALLINT(7)是

即INSERT / ADD ..等主键INTO第一个字段记录(如前所述,不添加其他“ id”字段)。

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.