mysql - 在锁定表时重新编号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' 没有被锁定表锁定,这帮助我走到了这一步)
解决方案
推荐阅读
- wordpress - 如何删除主题中 wordpress 插件中定义的操作?
- amazon-ec2 - 如何在 Amazon Ec2 中正确使用 redis 服务器
- arrays - 索引超出范围数组下标
- angular - 将字符串数组更改为 int 数组
- php - 找不到从今天开始动态返回相对于每周日期数组的函数
- android - 在 Visual Studio 中编译 Android 应用程序 - 如何针对较低的 API 级别
- speech-recognition - 可以在 ML.NET 中进行语音识别吗?
- python - 在 Python 中更改列的日期格式
- r - 如何根据其他列更新向量中的值
- swift - 在 Swift 中获取通知的时间