MySQL主键自增问题

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

请注意,所有我的entry_id的值都为1。
7个回答

5

尝试使用自增值创建一个新表,然后在现有表中执行INSERT SELECT操作(不包括具有错误键值的列)到新表中。这样可以自动填充键值。最后删除旧表并将新表重命名。


2

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

ALTER TABLE your_table
ADD PRIMARY KEY (entry_id);

2

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

update your_table set entry_id=@curRow;

我在我的测试表上尝试了这个,它将所有内容都设置为“NULL”。 - Bart Friederichs

2
  1. 将所有的entry_id值重置为NULL
  2. 将字段entry_id设置为PRIMARY+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);

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


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

1

在进行查询时,始终备份表并在此查询中工作,这不会影响任何表。如果您将自动递增为1,一旦添加记录,如果中存在1,它将返回重复错误。因此,为了避免插入重复值,从auto_incremententity_idmaximum值开始是很简单的。

如果我错了,请纠正我。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接