如何在mysql中重新填充/重新创建自动增量

时间:2010-03-16 13:24:06

标签: mysql

我想知道我是否可以在mysql中重新填充自动增量值。

因为,我的记录看起来很相似:

ID Name
1  POP
3  OLO
12 lku

基本上,我想要一种方法来将ID更新为此

ID Name
1  POP
2  OLO
3  lku

有没有办法在mysql中执行此操作?

感谢。

3 个答案:

答案 0 :(得分:3)

调整主键不是最好的做法 - 最好让数据库自己处理它。如果在UPDATEALTER之间添加了另一条记录,则可能会出现问题。因此,您必须LOCK表,这可能会在繁忙的生产服务器上挂起其他查询和峰值负载。

LOCK TABLES table WRITE
UPDATE table SET id=3 WHERE id=12;
ALTER TABLE table AUTO_INCREMENT=4;
UNLOCK TABLES 

OR - 对于数千行(没有foriegn密钥依赖性):

CREATE TEMPORARY TABLE nameTemp( name varchar(128) not null )
INSERT INTO name SELECT name FROM firstTable
TRUNCATE firstTable
INSERT INTO firstTable SELECT name FROM nameTemp

后一种方法仅适用于没有外键的情况。如果你这样做,你将需要一个查找表。

CREATE TEMPORARY TABLE lookup( newId INTEGER AUTO_INCREMENT, oldId INTEGER, PRIMARY KEY newId( newId ) );
INSERT INTO lookup (oldId) SELECT id FROM firstTable
[do temp table queries above]

您现在有一个lookup表,其中包含旧的到新的ID,您可以使用它来更新其他表上的外键依赖项(在测试服务器上!)

答案 1 :(得分:0)

更改主键是一个非常坏主意,因为它会危及您的引用完整性(如果另一个表使用该ID而没有正确的“更改”,那该怎么办?)。

如果你真的,真的必须这样做而不关心不良的副作用:

  • 创建具有相同结构的第二个表
  • INSERT INTO new_table(id,[other fields])SELECT NULL,[other fields] FROM old_table;
  • DROP old_table;
  • RENAME new_table old_table;

警告:
这将损坏该表上具有外键的所有其他表(但如果你有这样的表,那么你就不会这样做了。)

答案 2 :(得分:0)

您可能想尝试类似......

Create Temporary table MyBackup
(  ID as your autoincrement,
   OldID as Int for backlinking/retention,
   RestOfFields as their type )

insert into MyBackup
(    OldID
     RestOfFields )
select 
     ID as OldID,
     RestOfFields
  from
     YourOriginalTable
  order by
     ID  (this is your original ID)

然后,您将拥有一个新表,其中包含已分配新ID的自动增量,但具有原始ID的完整副本。然后,您可以对其他表执行相关更新,并设置ID = ID,其中ID = OldID。通过原始ID按顺序保留您的插入,它将使数字不会被顺序更换。例如:如果您的表被订购为 旧ID = 3,新ID = 1 旧ID = 1,新ID = 3 旧ID = 12,新ID = 2

你的旧3将成为1,然后1将成为3,12成为2

旧ID = 1,新ID = 1 旧ID = 3,新ID = 2 旧ID = 12,新ID = 3

你的3将不会覆盖更高的数字,并且12的不会与3的冲突,因为三分球已经降到2分。