ChatGPT解决这个技术问题 Extra ChatGPT

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

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

您可以轻松地执行 alter table 来添加密钥,但 MySQL 不会为没有 ID 的字段生成 ID。您必须手动更新现有字段,然后确保您的新 auto_increment 从正确的偏移量开始 - 它默认为“1”,无论如何您最终都会遇到重复的键错误。
@MarcB 我刚刚测试过,实际上它确实插入了从 1 开始的现有行的 id

M
Michael Berkowski

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

ALTER TABLE tbl ADD id INT PRIMARY KEY AUTO_INCREMENT;

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


是的,这就是我的经验。永远不要记得必须运行单独的脚本来填充 auto_increment id...
哈哈谢谢。我的错。绿色标记是给你的,因为那时你的更容易实现。 :D
要使其成为第一列,请使用 FIRST 例如 ALTER TABLE tbl1 ADD id INT PRIMARY KEY AUTO_INCREMENT FIRST;
@Nikkie SQLite 的机制完全不同。您可以在此处找到建议stackoverflow.com/questions/946011/sqlite-add-primary-key
@WijaySharma 如果您使用自动增量创建行并且必须立即通过 id 检索它,MySQL 为该值提供 LAST_INSERT_ID() SELECT * FROM table_name WHERE id = LAST_INSERT_ID(),并且大多数编程语言 API 提供一些函数/方法来在应用程序代码中返回该值。
S
SirDerpington

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

最后的 FIRST 有什么作用?
它将使新的 id 列成为表中的第一个而不是最后一个,这是默认行为。
工作不错!谢谢!
C
Community

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

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

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


K
KaiserKatze

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

ALTER TABLE table_name MODIFY id INT AUTO_INCREMENT;

为避免 Multiple primary key defined 错误,应该使用这种方法
S
Skatox

是的,这样的事情可以做到,但它可能不是最好的。您可能想要进行备份:

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


I
Infinite Recursion

我找到的最简单和最快的就是这个

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

d
drchuck

我能够调整这些说明,获取具有现有非增量主键的表,并向表中添加一个递增主键,并使用以下命令创建一个新的复合主键,并将旧键和新键作为复合主键代码:

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


D
David C

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


g
gofr1

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

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
H
Humphrey

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


H
Hrushikesh vanga

ALTER TABLE tableName MODIFY tableNameID MEDIUMINT NOT NULL AUTO_INCREMENT;

这里 tableName 是你的表的名称,

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

MEDIUMINT 是现有主键的数据类型

AUTO_INCREMENT 你必须在非空之后添加 auto_increment

它将使主键 auto_increment ......

希望这会有所帮助:)


如果您 edit 并添加一些解释,将会很有用。
D
David Buck

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

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

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

D
De Teague

如何编写 PHP 来更改已经存在的字段(在本例中为名称)以使其成为主键? W/o,当然,向表中添加任何额外的“id”字段..

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

这是寻求的最终结果(表描述)-

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

而不是得到这个 -

找到的记录数:5 id int(11) NO PRI 名称 VARCHAR(20) YES 品种 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)";

如何得到这个? -

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

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


M
Michael Kaufman

没有现有的主键


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 命令的原因。