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

我想改变一个没有主键和auto_increment列的表。 我知道如何添加一个主键列,但我想知道是否有可能自动插入数据到主键列(我已经有500行数据库,并希望给他们的ID,但我不想手动) 。 有什么想法吗? 非常感谢。

添加PRIMARY KEY列的ALTER TABLE语句在我的testing中正常工作:

 ALTER TABLE tbl ADD id INT PRIMARY KEY AUTO_INCREMENT; 

在为testing目的创build的临时表上,上述语句创buildAUTO_INCREMENT id列,并为表中每个现有行插入自动递增值,从1开始。

假设你没有像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 

是的,像这样的事情会做,可能不是最好的,你可能想做一个备份

 $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++; } 

请注意,您select的any_field在更新时必须相同。

我发现最简单和最快的是这个

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

对于像我自己得到一个Multiple primary key defined错误尝试:

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

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

我能够适应这些指令采取与现有的非增量主键的表,并添加一个增量主键到表中,并创build一个新的复合主键与新旧键作为复合主键使用以下码:

 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表之前拆除所有的外键,然后重build它们。 但是现在我想把这个解决scheme分享给原始问题的更具挑战性的版本,以防其他人遇到这种情况。

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

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

 ALTER TABLE mydb.mytable ADD pk_columnName INT IDENTITY 

如何编写PHP到ALTER已经存在的字段(在这个例子中的名称),使其成为主键? W / O,当然,添加任何额外的'ID'字段的表..

当前创build的一个表 – find的logging数:4名称VARCHAR(20)是品种VARCHAR(30)是颜色VARCHAR(20)是重量SMALLINT(7)是

这是最终结果(表格描述) –

find的logging数:4名称VARCHAR(20)否PRI品种VARCHAR(30)是颜色VARCHAR(20)是重量SMALLINT(7)是

而不是得到这个 –

find的logging数:5 id int(11)NO PRI name VARCHAR(20)是breed VARCHAR(30)YES color VARCHAR(20)YES weight SMALLINT(7)YES

试过后

$ query =“ALTER TABLE racehorses ADD id INT NOT NULL AUTO_INCREMENT FIRST,ADD PRIMARY KEY(id)”;

如何得到这个? –

find的logging数:4名称VARCHAR(20)否PRI品种VARCHAR(30)是颜色VARCHAR(20)是重量SMALLINT(7)是

即INSERT / ADD ..等主键INTO第一个字段logging(没有添加额外的“ID”字段,如前所述。