我有一张桌子
{1}将entry_id设置为自动增量。但我忘了把(entry_id, user_id, event_id)
作为主键。现在我有大约400个具有相同entry_id
的条目。它没有增加。如何更改它以使entry_id是唯一的而不删除表?
如果我执行以下查询,我会丢失任何内容吗?
entry_id
请注意,我的所有ALTER TABLE your_table
ADD PRIMARY KEY (entry_id);
都有1作为值。
答案 0 :(得分:5)
尝试使用自动增量值创建一个新表,然后使用现有表(不包括具有错误键值的列)对INSERT SELECT
进行新表。这应该自动填充密钥。最后,删除旧表并重命名新表。
答案 1 :(得分:2)
我认为,首先你应该运行一个循环遍历每一行的脚本,并以自动递增的方式设置entry_id。并运行查询
ALTER TABLE your_table
ADD PRIMARY KEY (entry_id);
答案 2 :(得分:2)
您可以使用行号设置主键列:
update your_table set entry_id=@curRow;
答案 3 :(得分:2)
entry_id
值重置为NULL 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);
答案 4 :(得分: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
。
答案 5 :(得分:1)
始终拥有表的备份并在此查询中工作,它不会影响任何表。
此外,如果您拥有auto increment as 1
,则在添加记录后,如果error as duplicate
中1 is exists
,则会返回table
。所以从{{1}开始会很简单用于auto_increment的entity_id的值,以避免此类重复值插入。
如果错了,请纠正我
答案 6 :(得分: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);