gpt4 book ai didi

MySQL UPDATE 两个表结果不符合预期(查询执行的顺序是什么?)

转载 作者:行者123 更新时间:2023-11-29 03:04:24 32 4
gpt4 key购买 nike

第一个表18_6_TransactionPartners

CompanyName | RegistrationNumber | PreviousCompanyName
----------------------------------------------------------
tests5555 | x | tests444

第二张表2_1_journal

专栏

 TransactionPartnerName
-------------------------
tests444

尝试更新两个表,例如,CompanyName = tests111 的变量,其中 RegistrationNumber 的变量是 x

查询

UPDATE

18_6_TransactionPartners , 2_1_journal

SET

18_6_TransactionPartners.PreviousCompanyName=IF(18_6_TransactionPartners.RegistrationNumber = ?, 18_6_TransactionPartners.CompanyName, 18_6_TransactionPartners.PreviousCompanyName),

18_6_TransactionPartners.CompanyName=IF(18_6_TransactionPartners.RegistrationNumber = ?, ?, 18_6_TransactionPartners.CompanyName),

2_1_journal.TransactionPartnerName=IF(2_1_journal.TransactionPartnerName = 18_6_TransactionPartners.PreviousCompanyName, 18_6_TransactionPartners.CompanyName, 2_1_journal.TransactionPartnerName)

作为结果得到

第一个表18_6_TransactionPartners

CompanyName | RegistrationNumber | PreviousCompanyName
----------------------------------------------------------
tests111 | x | tests5555

18_6_TransactionPartners一切正常(没有问题;表只是为了显示情况)

但是第二个表 2_1_journal 得到

专栏

 TransactionPartnerName
-------------------------
tests555

但是期望得到 tests111

查询 2_1_journal.TransactionPartnerName=IF(2_1_journal.TransactionPartnerName = 18_6_TransactionPartners.PreviousCompanyName, 18_6_TransactionPartners.CompanyName, 2_1_journal.TransactionPartnerName) 有问题吗?

假设,查询首先必须将值从CompanyName 复制到PreviousCompanyName。然后在 CompanyName 中插入新值。然后插入 TransactionPartnerName

但是没有。在我看来,它插入的不是 CompanyName 值,而是 PreviousCompanyName 值。或者首先插入表2_1_journal

请告诉我什么是正确的查询

最佳答案

这是预期的行为。每当在更新子句中引用字段时,这些字段的值将是更新前的值。所以在你的情况下,最后一个更新子句

2_1_journal.TransactionPartnerName=IF(2_1_journal.TransactionPartnerName = 18_6_TransactionPartners.PreviousCompanyName, 18_6_TransactionPartners.CompanyName, 2_1_journal.TransactionPartnerName)

将获得 18_6_TransactionPartners.CompanyName 的值,因为它是更新前的值,所以 tests111。

作为快速修复,您需要在子句中传递新值以获得您想要的结果:

2_1_journal.TransactionPartnerName=IF(2_1_journal.TransactionPartnerName = 18_6_TransactionPartners.PreviousCompanyName, ?, 2_1_journal.TransactionPartnerName)

您真正想要的是使用 transactions (如果使用 InnoDB 引擎):

BEGIN;
SELECT PreviousCompanyName FROM 18_6_TransactionPartners WHERE RegistrationNumber = ? FOR UPDATE; //plug in 'x' and save the value of PreviousCompanyName
UPDATE 18_6_TransactionPartners SET PreviousCompanyName = CompanyName, CompanyName = ? WHERE RegistrationNumber = ?; //plug in 'tests111' and 'x'
UPDATE 2_1_journal SET TransactionPartnerName = ? WHERE TransactionPartnerName = ?; //plug in 'test111' and your saved value of PreviousCompanyName
COMMIT;

或者,如果您总是想更新 2_1_journal 表中的值,您可以简单地执行以下操作:

BEGIN;
UPDATE 18_6_TransactionPartners SET PreviousCompanyName = CompanyName, CompanyName = ? WHERE RegistrationNumber = ?; //plug in 'tests111' and 'x'
UPDATE 2_1_journal SET TransactionPartnerName = (SELECT CompanyName FROM 18_6_TransactionPartners WHERE RegistrationNumber = ?); //plug in 'x'
COMMIT;

关于MySQL UPDATE 两个表结果不符合预期(查询执行的顺序是什么?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18225131/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com