如果 mysql 链接服务器中的另一个数据与本地 sql 服务器中的数据匹配,如何更新 mysql 链接服务器中的数据

How to update data in a mysql linked server if another data from it matches the data from the local sql server

提问人:Chloe 提问时间:10/7/2023 最后编辑:Chloe 更新时间:10/7/2023 访问量:56

问:

我有两个表,都是本地的: SQL Server 中的 tableA userId、userNo(所有 nvchar) 链接 MySQL 中的 tableB userid、userno(所有 nvchar)

如果 userId 与 userid 匹配,我想将 userNo 更新为 userno。

并在 tableA 中创建为触发器,以便在数据到来时更新 tableB。

我尝试进行的每个查询都会给我带来语法错误或其他东西。

请帮忙,谢谢!

我在下面尝试过

SELECT userId FROM tableA AS a

SELECT * FROM OPENQUERY(MYSQL_LINKED,'SELECT userid FROM tableB') AS b

UPDATE OPENQUERY(MYSQL_LINKED, 'select userno from tableB')
SET userno = userNo
WHERE a = b 

根据 @Patrick Hurst 更新

UPDATE a
   SET a.userno = s._userNo
  FROM OPENQUERY(MYSQL_LINKED, 'SELECT * FROM gameacc.logintable 
 WHERE userid = ''s._userId''') a
    INNER JOIN WORLDDB.GAME.USERINFO s
      ON a.userid = s._userId;

我运行了上面的代码,它确实没有出现任何错误,但是它说“受影响的行:0”,但我很确定 userid 和 _userId 都有数据并且可以确认它们是相同的,我该怎么办?

mysql sql-server

评论

0赞 Patrick Hurst 10/7/2023
您是否需要使用两种不同的 RDMS?这对你来说会更加艰难,特别是作为一个新手,如果你能把你的数据带到一个实例和/或数据库中。
0赞 Chloe 10/7/2023
自从我在MSSQL中关闭了远程连接以来,我必须这样做,我有理由......因此,我使用MySQL作为桥梁来操作我的程序的数据,因此它不必直接连接到MSSQL。
0赞 Patrick Hurst 10/7/2023
这是一个非常糟糕的设计选择。我强烈建议你选择一个并坚持下去。您正在引入各种潜在问题。如果您不想使用 SQL Server,请将数据导入 MySQL(也许使用链接服务器?),反之亦然。
0赞 Chloe 10/7/2023
@PatrickHurst我知道这不是最好的方法,但我有理由......我不能直接使用mssql的原因是因为我的一个程序只能使用mssql,它必须使用具有所有权限的某个用户/通行证,并且这些信息在Internet上是公开的,这也是我无法更改的。如果我打开MSSQL的远程连接并通过我的客户端程序使用它,那对我来说肯定会更容易,但任何人都知道我的IP可以轻松访问我的MSSQL

答:

1赞 Patrick Hurst 10/7/2023 #1

您可以尝试以下语法:

UPDATE a
   SET <ColumnToUpdate> = <Value>
  FROM OPENQUERY(<YourLinkedServer>, 'SELECT * FROM <Database>.<Schema>.<Table> 
 WHERE <FilterColumn> = ''<FilterValue>''') a
    INNER JOIN <LocalDatabase>.<LocalSchema>.<LocalTable> s
      ON a.<RemoteColumnToMatchOn> = s.<LocalColumnToMatchOn>;

将占位符替换为您的值。

最好首先使用 WHERE 子句将更新限制为单行,以确保更改符合预期。

评论

0赞 Chloe 10/7/2023
谢谢你这么快的回答!但是,我不想输入任何手动数据,因为我希望它自动作为触发器执行,因为数据已经存在。
0赞 Patrick Hurst 10/7/2023
理解,但您可以将 和 替换为列名。不过,请务必使用适当的别名。<ColumnToUpdate><Value>
0赞 Chloe 10/7/2023
现在这是我非常困惑的部分,例如,如何为我的情况使用适当的别名?非常感谢!
0赞 Patrick Hurst 10/7/2023
您可以选择别名。例如:在本例中是表的别名。在上面的示例中,REMOTE 表的别名为 ,本地表为 。为了更新远程表,我们曾经将其更改为使用我们可能使用的列名,这将导致远程列 MyColumn 设置为本地列 MyLocalColumn 的值SELECT * FROM MyTable aaasUPDATE a SET <ColumnName> = <Value>UPDATE a SET MyColumn = s.MyLocalColumn
0赞 Chloe 10/7/2023
我运行了您的代码,它确实没有出现错误,但是它说“受影响的行:0”,但我很确定 userid 和 _userId 都有数据并且可以确认它们是相同的,我该怎么办?