【问题标题】:SQL server openquery - "Key column information is insufficient or incorrect. Too many rows were affected by update."SQL server openquery - “键列信息不足或不正确。更新影响的行太多。”
【发布时间】:2012-05-21 16:17:37
【问题描述】:

我正在尝试从 Micrsoft SQL 服务器运行删除查询以清除远程 mySQL 表中的表。

查询是:

delete from OPENQUERY(WEB_DB,'select id,university_name,college_name from table_name');

这是返回错误:

返回链接服务器“WEB_DB”的 OLE DB 提供程序“MSDASQL” message "关键列信息不足或不正确。太多 行受到更新的影响。”。消息 7345,级别 16,状态 1,行 1 链接服务器“WEB_DB”的 OLE DB 提供程序“MSDASQL”无法 从表中删除“选择 id,university_name,college_name 来自 table_name"。更新不符合架构 要求。

用于创建表的SQL如下:

CREATE TABLE IF NOT EXISTS `table_name` (
  `pk` int(11) AUTO_INCREMENT,
  `studentid` int(11) default NULL,
  `university_name` varchar(255) default NULL,
  `college_name` varchar(255) default NULL,
  CONSTRAINT PRIMARY KEY(`pk`)
);

有趣的是,它确实删除了远程数据库记录的某些部分,应该有 ~900,第一次运行删除命令会将其减少到 ~700,所以看起来限制大约是 200 行?!

非常感谢任何帮助。

谢谢 乔纳

【问题讨论】:

  • 你的表有主键吗?
  • 目前没有,需要创建一个新列,因为 id 可以有重复的值。
  • 哇...对于一个既可以为空又可以包含重复项的列的名称非常具有误导性。我很高兴是你而不是我来处理这个烂摊子。
  • 我会按照@Mark 的建议从创建主键开始,即使您不打算使用它。否则 sql 引擎可能会混淆识别要删除的行。只是为了澄清,如果 ms sql 怀疑目标链接服务器不支持某些东西,它往往会拉出他身边的所有条目,创建查询并使用“真实”数据将它们推回。所以,我想这就是他被重复检查卡住的地方。
  • 您好,已添加主键,但似乎没有任何区别。 id 实际上是一个 studentid,它是学生表中 one->many 连接的多端。已使用新 SQL 更新问题。

标签: mysql sql sql-server-2008 openquery


【解决方案1】:

如果您尝试删除远程表中的所有行,为什么不这样做:

DELETE WEB_DB...table_name;

或者如果这是你经常做的事情,为什么不在另一端放置一个存储过程来调用呢?

你也可以试试:

EXEC ('delete table_name') AT WEB_DB;

【讨论】:

  • 感谢您的回答,如果您喜欢显示链接服务器上使用的删除语法形式的页面,我似乎无法使其工作。存储过程可能是要走的路,但似乎应该以这种方式工作。
  • 我没有设置任何 MySQL,抱歉。它可能必须是 WEB_DB.dbname..table_nameWEB_DB.dbname.table_name...
【解决方案2】:

要使用openquery清除mysql中的表,你应该试试这个:

EXEC('TRUNCATE TABLE table_name') AT WEB_DB

【讨论】:

    【解决方案3】:

    下面的语法为我解决了这个问题:

    EXEC ('delete table_name where a in (1,2,3)') AT linked_server
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-06
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-15
      相关资源
      最近更新 更多