首页 > 解决方案 > 在锁定表时重新编号mysql中的主键

问题描述

我在两个不同的数据库中有两个具有相同结构的表。我想将记录从一个插入另一个,但我不能确定没有重复的主键。因此,我想重新编号源表中的主键以避免该问题,方法是使它们大于目标表中使用的任何键。

(在这样做的过程中,我发现了应该很明显的一点,即我还必须使新值大于源表中的任何现有值!)

在我的代码中,源表是 VDA_test,目标表是 DCS_test。这是我对一个表的主键进行重新编号的代码

UNLOCK TABLES;
LOCK TABLES DCS_test.tblActions READ, VDA_test.tblActions WRITE;
UPDATE VDA_test.tblActions SET pkAction = pkAction + (SELECT MAX(pkAction) FROM DCS_test.tblActions) + (SELECT MAX(pkAction) FROM VDA_test.tblActions) WHERE pkAction > 0;

“WHERE pkAction > 0”只是为了阻止 WorkBench 抱怨“不安全”更新(即使我已经关闭了警告)

代码产生

错误代码:1100。表 'tblActions' 未使用 LOCK TABLES 锁定

如果我不包括

 + (SELECT MAX(pkAction) FROM VDA_test.tblActions)

我没有收到错误(但我重复了)

此代码没有错误,

UNLOCK TABLES;
SELECT MAX(pkAction) INTO @pkActionMax FROM VDA_test.tblActions;
LOCK TABLES DCS_test.tblActions READ, VDA_test.tblActions WRITE;
UPDATE VDA_test.tblActions SET pkAction = pkAction + (SELECT MAX(pkAction) FROM DCS_test.tblActions) + @pkActionMax WHERE pkAction > 0;

但它不是“安全的”,因为源中的最大 PK 是在表被锁定之前派生的。有安全的方法吗?

(PS 我想感谢傻瓜4jesus 对 Simin Jie 对MySQL 的回答的评论——表 'my_table' 没有被锁定表锁定,这帮助我走到了这一步)

标签: mysqllockingprimary-key

解决方案


推荐阅读