我有一个带有链接 MySQL 服务器的 MS SQL Server。我需要在两台服务器之间部分同步一个表。这是根据条件分三步完成的:
从MySQL表中删除所有不满足条件的行
在MySQL表中插入所有满足条件的新行
更新MySQL服务器中满足条件且MySQL与SQL Server数据不同的所有行
第 1 步和第 2 步始终可以正常运行。但是如果有任何更新,第 3 步将不会运行。查询失败,出现以下异常:行集正在使用开放式并发,并且在上次提取或重新同步包含行后更改了列的值。]。
这是执行的查询:
update mysqlserver...subscribers
set Firstname = Voornaam,
Middlename = Tussenvoegsel,
Surname = Achternaam,
email = e-mail
from mysqlserver...subscribers as b, tblkandidaat
where (b.kandidaatid = tblkandidaat.kandidaatid) and
(tblkandidaat.kandidaatid in (
select subsc.kandidaatid
from mysqlserver...subscribers subsc inner join tblKandidaat
on (subsc.kandidaatid=tblKandidaat.kandidaatid)
where (subsc.list=1) and
((subsc.firstname COLLATE Latin1_General_CI_AI <> Voornaam
or (subsc.middlename COLLATE Latin1_General_CI_AI <> Tussenvoegsel)
or (subsc.surname COLLATE Latin1_General_CI_AI <> tblKandidaat.Achternaam)
or (subsc.email COLLATE Latin1_General_CI_AI <> tblKandidaat.e-mail))
));
有人知道如何防止这种情况发生吗?
最佳答案
试试这个查询:
update b
set
Firstname = Voornaam,
Middlename = Tussenvoegsel,
Surname = Achternaam,
email = e-mail
from
mysqlserver...subscribers b
inner join tblkandidaat k on b.kandidaatid = k.kandidaatid
where
b.list=1
and (
b.firstname COLLATE Latin1_General_CI_AI <> k.Voornaam
or b.middlename COLLATE Latin1_General_CI_AI <> k.Tussenvoegsel
or b.surname COLLATE Latin1_General_CI_AI <> k.Achternaam
or b.email COLLATE Latin1_General_CI_AI <> k.e-mail
)
最佳做法是使用 ANSI 联接并将 JOIN 条件与 WHERE 条件正确分开。
在整个查询中为所有表使用别名而不是长表名更具可读性。
最好为所有列引用使用别名,而不是将它们留空。这不仅是一个好习惯,而且让事情变得更清晰,还可以避免在内部表与外部表引用中出现一些非常讨厌的错误。
如果性能也是一个问题:链接服务器连接有时会转移到数据库数据提供程序引擎中的逐行处理。我发现这样的情况,其中将跨链接服务器的复杂连接的一部分分解为常规连接,然后进行交叉应用,这极大地减少了获取不需要的行并大大提高了性能。 (这实际上是在进行书签查找,也就是非聚集索引扫描,然后使用这些值进行聚集索引查找)。虽然这可能不完全符合 MySql 的工作方式,但值得尝试。如果您可以进行任何类型的跟踪以查看在 MySql 端执行的实际查询,您可能会深入了解用于提高性能的其他方法。
另一个提高性能的想法是将远程数据本地复制到临时表,并添加一个 ActionRequired 列。然后更新临时表,使其看起来像它应该的那样,将“U”、“I”或“D”放入 ActionRequired,然后使用 ActionRequired 在主键上使用简单的等值连接在链接服务器上执行合并/更新插入。仔细注意可能在处理过程中更新远程数据库的竞争条件。
当心空值...您要比较的所有这些列都是不可空的吗?
关于mysql - 从 SQL Server 更新对链接 MySQL 表的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1206136/