首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Server更新链接MySQL表的查询

问从Server更新链接MySQL表的查询
EN

Stack Overflow用户
提问于 2009-07-30 11:58:08
回答 7查看 5.8K关注 0票数 6

我有一个带有链接MySQL服务器的。我需要在两个服务器之间部分同步一个表。这分三个步骤进行,并基于一个条件:

  1. 从MySQL表中删除不满足条件的所有行
  2. 在满足条件的MySQL表中插入所有新行
  3. 更新MySQL服务器中满足条件并在MySQL和server之间具有不同数据的所有行

步骤1和步骤2总是没有问题地运行。但是,如果有任何需要更新的内容,第3步将不会运行。查询失败,但有以下例外:行集使用乐观并发,列的值在包含的行上次被获取或重新同步后发生了更改。]

这是执行的查询:

代码语言:javascript
复制
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))
  ));

有谁知道怎么防止这事吗?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-01-15 19:33:50

请尝试以下查询:

代码语言:javascript
复制
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
   )
  1. 最好的做法是使用ANSI联接,并正确地将联接条件与WHERE条件分开。
  2. 在整个查询过程中,对所有表使用别名而不是使用长表名更易读。
  3. 最好对所有列引用使用别名,而不是将它们保留为空白。这不仅是一个良好的习惯,并使事情更清楚,它可以避免一些非常讨厌的错误,在内-vs-表引用。
  4. 如果性能也是一个问题:链接服务器联接有时会在DB数据提供程序引擎中转移到逐行处理。我发现了这样的情况:将复杂连接的一部分从链接服务器分解为常规连接,然后是交叉应用,极大地减少了不需要的行,大大提高了性能。(这实际上是在进行书签查找,也就是非聚集索引扫描,然后使用这些值进行聚集索引查找)。虽然这可能不完全符合MySql的工作方式,但还是值得尝试的。如果您可以执行任何类型的跟踪来查看在MySql端执行的实际查询,您可能会了解用于提高性能的其他方法。
  5. 另一个提高性能的方法是将远程数据本地复制到临时表中,并添加一个ActionRequired列。然后更新临时表,使其看起来应该这样,在ActionRequired中放置“U”、“i”或“D”,然后使用ActionRequired在主键上使用简单的等号连接在链接服务器上执行合并/重新插入。仔细注意可能的竞争条件,以便在处理过程中更新远程数据库。
  6. 小心明渠..。你比较的那些列都是非空的吗?
票数 2
EN

Stack Overflow用户

发布于 2009-07-31 03:36:18

您可以尝试在mysql中创建第二个表,对所有更改的行执行从sql-server到空表的插入,并在两个mysql表之间执行步骤3。

票数 0
EN

Stack Overflow用户

发布于 2010-01-02 07:05:50

在where语句中不要使用子查询。子查询可能返回多行,然后得到错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1206136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档