【问题标题】:Updating rows in a ResultSet from an inner join从内部联接更新 ResultSet 中的行
【发布时间】:2013-05-22 19:51:27
【问题描述】:

我有表 AB,它们都有相同的主键 (Col1)。

表 A 表 B 第 1 栏 |第 2 栏 |第 3 列 第 1 列 |第四栏

我想根据表 A 中相应行的信息更新表 B 中的行。如果我要在两个表上获得一个带有内连接的结果集,

select A.Col1, A.Col2, A.Col3, B.Col4 from A inner join B on A.Col1=B.Col1;

我可以遍历这个结果集并更新表 B 中的 Col4 吗?也就是说,使用 JDBC/ResultSet updateX(...) 方法?

我问的原因是,从结果集 A 连接 B 更新表 B 似乎有点奇怪。


澄清:不确定这是否重要,但我有兴趣通过 JDBC ResultSet 接口更新行,而不是直接的 MySQL 更新查询。感谢您的回复!

【问题讨论】:

  • 您可以通过 JOIN 进行更新——但是您希望将值更新为什么?
  • JDBC 的某些功能并非总是由数据库供应商实现。
  • @sgeddes:Col3 中有一个字符串需要与 Regex 匹配,根据匹配情况更新 Col4。
  • @Paul Vargas:供应商是 MySQL
  • 需要同样的问题。 DBServer:MariaDB 5.5.38,JDBC:mysql-connector-java-5.1.31-bin.jar。两张表都有主键,结果集取自CallableStatement,过程从两张表中选择数据。并且错误:结果集不可更新(引用的表没有主键)。此结果集必须来自使用 ResultSet.CONCUR_UPDATABLE 结果集类型创建的语句,查询必须只选择一个表,不能使用函数并且必须从该表中选择所有主键。有关详细信息,请参阅 JDBC 2.1 API 规范,第 5.6 节。

标签: java mysql sql jdbc


【解决方案1】:

我偶然发现了这个,寻找我想要转换一些数据并在表之间移动它的场景。

有两种解决方法,但它涉及创建临时列。

  • 首先在目标表中,创建转换所需字段的临时列
  • 其次,使用简单的 SQL 更新从另一个表中填充这些列
  • 第三次使用可更新的结果集来执行您最初想要执行的转换
  • 最后删除临时列

【讨论】:

    【解决方案2】:

    这对我有用:

    UPDATE
        B
    INNER JOIN
        A ON B.id=A.id 
    SET
        B.value=A.value
    

    fiddle

    这是一个骨架,根据需要更新B的其他列。

    【讨论】:

    • 最有可能的问题是关于使用 Java ResultSet 的更新功能,您可以通过结果集更新而不自己发出查询(驱动程序为您执行此操作,或者数据库支持可更新结果集)
    • @MarkRotteveel Ahh,ktm5124 在我提供答案后添加了此说明
    【解决方案3】:

    您应该能够使用 JOIN 更新 TableB:

    UPDATE TableB B
        JOIN TableA A ON B.Col1=A.Col1
    SET B.Col4 = 'Some Value'
    WHERE A.Col2 REGEXP 'Some Regex'
    

    不知道要使用什么正则表达式,在什么场景下,以及要将 Col4 更新到什么值,这会有点困难,但这应该非常接近。

    【讨论】:

      猜你喜欢
      • 2012-10-04
      • 2014-06-09
      • 1970-01-01
      • 1970-01-01
      • 2015-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-03
      相关资源
      最近更新 更多