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

时间:2012-01-30 21:05:50

标签: mysql primary-key

我正在尝试更改没有主键或auto_increment列的表。我知道如何添加主键列,但我想知道是否可以自动将数据插入主键列(我已经在DB中有500行并且想要给它们id,但我不想手动执行) 。有什么想法吗?非常感谢。

12 个答案:

答案 0 :(得分:228)

添加ALTER TABLE列的PRIMARY KEY语句在我的测试中正常运行:

ALTER TABLE tbl ADD id INT PRIMARY KEY AUTO_INCREMENT;

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

答案 1 :(得分:43)

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

答案 2 :(得分:4)

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

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

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

答案 3 :(得分:3)

是的,这样的事情可以做到,可能不是最好的,你可能想要备份

$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 :(得分:2)

我找到的最简单,最快捷的是

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

答案 5 :(得分: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”,您可以反复运行以试验变体。

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

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

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

答案 6 :(得分:2)

为了将现有的主键设为 auto_increment,您可以使用:

ALTER TABLE table_name MODIFY id INT AUTO_INCREMENT;

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

答案 9 :(得分:0)

ALTER TABLE tableName 修改 tableNameID MEDIUMINT NOT NULL AUTO_INCREMENT ;

tableName 是您的表的名称,

tableName 是您必须修改的主要列名称

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

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

它将使主键自动递增……

希望这会有所帮助:)

答案 10 :(得分:0)

嗯,您有多种方法可以做到这一点: -如果您的表上没有任何数据,只需将其删除并重新创建即可。

删除现有字段并再次创建它

ALTER TABLE test DROP PRIMARY KEY, DROP test_id, ADD test_id int AUTO_INCREMENT NOT NULL FIRST, ADD PRIMARY KEY (test_id);

或者只是对其进行修改

ALTER TABLE test MODIFY test_id INT AUTO_INCREMENT NOT NULL, ADD PRIMARY KEY (test_id);

答案 11 :(得分:-1)

如何编写PHP以更改已存在的字段(在此示例中为name)以使其成为主键?当然,没有,在表格中添加任何额外的“id”字段..

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

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

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

而不是得到这个 -

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

尝试后..

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

怎么弄这个? -

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

即。 INSERT / ADD ..等主键INTO第一个字段记录(没有添加额外的'id'字段,如前所述。