自动插入自增主键和值到现有表中

问题描述 投票:0回答:15

我正在尝试更改没有主键也没有自动增量列的表。我知道如何添加自动增量主键列。

我数据库中已经有 500 行,想给它们 id,但我不想手动执行。

如何自动向主键列插入数据?

mysql primary-key
15个回答
335
投票

添加

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

ALTER TABLE tbl ADD id INT PRIMARY KEY AUTO_INCREMENT;

在出于测试目的而创建的临时表上,上述语句创建了

AUTO_INCREMENT
id
列,并为表中的每个现有行插入了自动增量值,从 1 开始。


69
投票

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

9
投票

为了使现有主键为

auto_increment
,您可以使用:

ALTER TABLE table_name MODIFY id INT AUTO_INCREMENT;

8
投票

对于像我这样遇到

Multiple primary key defined
错误的人,请尝试:

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

在 MySQL v5.5.31 上,这将

id
列设置为我的主键,并用递增值填充每一行。


6
投票

是的,像这样的东西可以做到,但它可能不是最好的。您可能想要备份:

$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
必须相同。


3
投票

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

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

3
投票

我能够调整这些指令,采用具有“现有”非增量主键的表,并向表中添加增量主键,并创建一个新的复合主键,其中旧键和新键都作为复合主键使用以下代码: 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 字段的情况。 当我尝试使用来自另一个表的传入外键执行更复杂的示例时,我收到此消息。

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

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


2
投票
没有现有主键

ALTER TABLE `db`.`table` ADD COLUMN `id` INT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (`id`); ;

表已经有一个现有的主键列

(不会删除旧的主键列)

ALTER TABLE `db`.`table` ADD COLUMN `id` INT NOT NULL AUTO_INCREMENT FIRST, CHANGE COLUMN `prev_column` `prev_column` VARCHAR(2000) NULL , DROP PRIMARY KEY, ADD PRIMARY KEY (`id`); ;

注意:列必须位于第一个才能自动递增,这就是 FIRST 命令的原因。


1
投票


1
投票

ALTER TABLE mydb.mytable ADD pk_columnName INT IDENTITY



1
投票

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

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);



1
投票
这里
tableName

是你的桌子的名称,

tableName

是你的列名,这是主要的,必须修改

MEDIUMINT

是现有主键的数据类型

AUTO_INCRMENT

你必须在 not null 之后添加 auto_increment 这将使主键自动递增。


1
投票


-1
投票

这是当前创建的表 - 找到的记录数:4 name VARCHAR(20) YES 品种 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 racehorses ADD id INT NOT NULL AUTO_INCRMENT FIRST, ADD PRIMARY KEY (id)”;

如何获得这个? -

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

即INSERT/ADD..等将主键插入第一个字段记录(不添加额外的“id”字段,如前所述。


-1
投票
	
© www.soinside.com 2019 - 2024. All rights reserved.