3

我有一个 (entry_id, user_id, event_id)entry_id 设置为自动递增的表。但我忘记了entry_id作为主键。现在我有大约 400 个相同的条目entry_id。它没有增加。如何更改它以使 entry_id 是唯一的而不删除表?

如果我执行以下查询,我会丢失任何东西吗?

ALTER TABLE your_table
ADD PRIMARY KEY (entry_id);

请注意,所有 myentry_id的值都为 1。

4

7 回答 7

5

尝试使用自动增量值创建一个新表,然后INSERT SELECT将现有表(不包括具有不正确键值的列)放入新表中。那应该自动填充密钥。最后,删除旧表并重命名新表。

于 2012-10-16T07:25:28.433 回答
2

我认为,首先您应该运行一个脚本,该脚本循环遍历每一行并以自动递增的方式设置 entry_id。并运行查询

ALTER TABLE your_table
ADD PRIMARY KEY (entry_id);
于 2012-10-16T07:27:30.423 回答
2

您可以使用行号来设置您的主键列:

update your_table set entry_id=@curRow;
于 2012-10-16T07:27:32.597 回答
2
  1. 将所有值重置entry_id为 NULL
  2. 使字段entry_idPRIMARY+AUTO_INCREMENT,MySQL 将为您做任何事情。

这是一个脚本 -

UPDATE your_table SET entry_id = NULL;

ALTER TABLE your_table
  CHANGE COLUMN entry_id entry_id INT(11) NOT NULL AUTO_INCREMENT,
  ADD PRIMARY KEY (entry_id);
于 2012-10-16T08:11:46.160 回答
1

您不会丢失任何东西,因为查询不会运行:

mysql> alter table test add primary key (entry_id);
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

要么重新编号你的entry_id列,要么将整个表格复制到一个新的(正确的)表格中,entry_id然后让它AUTO_INCREMENT为你服务。

于 2012-10-16T07:27:41.717 回答
1

总是有一个表的备份并在这个查询中工作它不会影响任何表。此外,如果你有auto increment as 1,一旦你添加记录,它会在.so中返回一个error as duplicateif1 is existstablemaximum

如果错了请纠正我

于 2012-10-16T07:30:50.787 回答
1

或者,您可以分两步执行此操作:

运行以下 SQL 以增加您的 ID:

begin
declare entry_id_upd, numberOfRecords, cursor int;
set numberOfRecords = (select count(*) from mytable);
set cursor = 0;
while cursor <= numberOfRecords do
set entry_id_upd = ( select entry_id from mytable where id = cursor ) + 1;
update mytable set entry_id = entry_id_upd where id = cursor;
set cursor = ( cursor + 1 );
end while;
end

然后设置主键:

ALTER TABLE mytable ADD PRIMARY KEY (entry_id);
于 2012-10-16T07:31:24.843 回答