我有一个有 3 行的查找表:
id | name
=== =======
1 Pendig
2 Sent
3 Failed
当我将此数据插入另一个服务器/数据库上的另一个表时,如何确保使用相同的自动递增 ID 创建相同的值(名称)?
由于它是一个查找表,我可以插入表中并指定 id 吗?
我有一个有 3 行的查找表:
id | name
=== =======
1 Pendig
2 Sent
3 Failed
当我将此数据插入另一个服务器/数据库上的另一个表时,如何确保使用相同的自动递增 ID 创建相同的值(名称)?
由于它是一个查找表,我可以插入表中并指定 id 吗?
由于您有查找表,因此它应该与id
实际情况无关。也就是说,你永远不应该看id
它本身,而只将它用于连接等。如果你想查找这个透明id
的,你应该使用name
.
要回答您的具体问题,是的,您可以在插入期间指定自动增量 ID:
INSERT INTO t1 (id, name) VALUES (1, 'Pendig')
您始终可以通过指定它来覆盖 auto_increment 表中的插入 ID:
INSERT INTO yourtable (id, name) VALUES (2, 'Sent');
并将2
作为 ID 值填充到表中。在执行任何其他插入并且表的内置 auto_increment 值恰好达到您自己插入的值之前,这完美地工作,例如,假设一个全新的新创建的表:
INSERT INTO yourtable (id, name) VALUES (2, 'Sent'); // force an ID
INSERT INTO yourtable (id, name) VALUES (NULL, 'foo'); // DB assigns 1
INSERT INTO yourtable (name) VALUES ('foo'); // DB assigns 2
第一个查询成功,第二个查询成功,第三个查询因主键冲突而失败,因为 DB 生成的 '2' id 现在与您手动插入的那个冲突。
如果你想保证不同数据库实例之间的ID和auto_increment兼容,那就用mysql_dump
吐表给你吧。它将确保保留表中的所有 ID,并确保内部 auto_increment 指针也正确发送。