2012-01-30 79 views
128

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

+2

您可以轻松地使用alter table来添加密钥,但MySQL不会为尚未拥有密钥的字段生成ID。你必须手动更新现有的字段,然后确保你的新auto_increment从右偏移量开始 - 它默认为'1',并且你最终只会有重复键错误。 – 2012-01-30 21:07:51

+2

@MarcB我刚刚测试过,它确实插入了现有行的ID,从1 – 2012-01-30 21:09:28

回答

206

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

ALTER TABLE tbl ADD id INT PRIMARY KEY AUTO_INCREMENT; 

在用于测试目的创建的临时表,上面的语句创建的AUTO_INCREMENTid柱插入自动递增值,为每个现有的行的表,从1开始

+1

开始,这是我的经验。永远不要记得必须运行一个单独的脚本来填充auto_increment ID ... – 2012-01-30 21:11:34

+1

哈哈..谢谢。我的错。绿色的标志是你的,因为你的更容易实现。 :D – FlyingCat 2012-01-30 21:24:14

+0

+1,在5.1.51-ndb-7.1.9a-log中工作,在带引擎的表上MyISAM – 2012-08-28 13:16:53

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必须在更新时相同。

+0

不错。谢谢。 – FlyingCat 2012-01-30 21:20:46

2

对于那些像我一样得到一个Multiple primary key defined错误,请尝试:

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

在MySQL v5.5.31此设置id列作为我的主键和填充每一行和递增值。

34

假设你没有像ID自动递增,否定的,那么你可以添加使用下面的查询栏:

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 2015-01-20 15:39:49

+1

它将使新的'id'列成为表中的第一个,而不是最后一个,这是默认行为。 – 2015-10-24 20:24:38

3

最简单快捷的,我觉得是这样的

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 TABLE之前拆除所有外键,然后在以后重建。但就目前而言,如果其他人遇到这种情况,我想将这个解决方案分享给原始问题的更具挑战性的版本。

1

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

-1

如何将PHP写入ALTER已存在的字段(在本例中为名称)以使其成为主键? W/O,当然,增加任何附加的 'id' 字段表..

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

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

数目的记录:4 名VARCHAR(20)NO PRI 品种VARCHAR(30)是 颜色VARCHAR(20)是 重量SMALLINT(7)是

非但没有这样的 -

记录的数量:5 ID INT(11)否PRI 名VARCHAR(20)是 品种VARCHAR(30)是 颜色VARCHAR(20)是 重量SMALLINT (7)是

尝试后..

$查询= “ALTER TABLE赛马ADD ID INT NOT NULL AUTO_INCREMENT首先,添加PRIMARY KEY(ID)”;

如何得到这个? -

数目的记录:4 名VARCHAR(20)NO PRI 品种VARCHAR(30)是 颜色VARCHAR(20)是 重量SMALLINT(7)是

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

0

您可以添加一个新的主键列到现有的表,它可以有序列号,使用命令:

ALTER TABLE mydb.mytable ADD pk_columnName INT IDENTITY 
0

我正面临同样的问题,所以我做了什么,我放弃了主键字段,然后重新创建并确保它是自动递增的。这对我有效。我希望它可以帮助其他人