2

第一张桌子18_6_TransactionPartners

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

第二张桌子2_1_journal

柱子

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

尝试使用例如变量 for CompanyName=来更新两个表,tests111其中变量 forRegistrationNumberx

询问

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)吗?

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

但不是。从我的观点来看,它不是CompanyName价值,而是PreviousCompanyName价值。还是首先插入表中2_1_journal

请建议什么是正确的查询

4

3 回答 3

1

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

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)

您真正想要的是处理事务(如果使用 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;
于 2013-08-14T07:22:36.153 回答
0

您是否必须在一个 SQL 语句中更新两个表。我不知道你甚至可以做到这一点 - 我会将它们分成单独的查询 - 也许这会使事情复杂化。

于 2013-08-14T07:00:31.067 回答
0

MySQL 不保证将更改应用于多表更新语句中的各个表的顺序。要完成您想要的操作,您应该将此操作作为事务中的两个 UPDATE 语句执行。

开始

更新 2_1_Journal ...

更新 18_6_TransactionPartners ...

犯罪

于 2013-08-14T07:20:14.143 回答