2012-10-16 124 views
3

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

如果我做了以下查询,我会失去什么?

ALTER TABLE your_table 
ADD PRIMARY KEY (entry_id); 

请注意,我所有的entry_id s都有1个值。

回答

2
  1. Rese t将所有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); 
5

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

2

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

ALTER TABLE your_table 
ADD PRIMARY KEY (entry_id); 
2

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

update your_table set [email protected]; 
+0

我想这对我的测试表,并将其设置一切'NULL'。 –

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

始终有一个表的备份并在此查询中工作,它不会影响任何表。 此外,如果您有auto increment as 1,则一旦添加记录,它将返回error as duplicate如果在table .so中,那么可以很简单地使用maximum值auto_increment的entity_id来避免这种重复值插入。

纠正我,如果“错了

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