我想知道我是否可以在mysql中重新填充自动增量值。
因为,我的记录看起来很相似:
ID Name
1 POP
3 OLO
12 lku
基本上,我想要一种方法来将ID更新为此
ID Name
1 POP
2 OLO
3 lku
有没有办法在mysql中执行此操作?
感谢。
答案 0 :(得分:3)
调整主键不是最好的做法 - 最好让数据库自己处理它。如果在UPDATE
和ALTER
之间添加了另一条记录,则可能会出现问题。因此,您必须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而没有正确的“更改”,那该怎么办?)。
如果你真的,真的必须这样做而不关心不良的副作用:
警告:
这将损坏该表上具有外键的所有其他表(但如果你有这样的表,那么你就不会这样做了。)
答案 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分。