【问题标题】:Convert MySQL update SQL statement to Oracle update statement [duplicate]将 MySQL 更新 SQL 语句转换为 Oracle 更新语句 [重复]
【发布时间】:2019-10-23 14:20:17
【问题描述】:

我的查询在 MySQL 上运行良好,但如果我在 Oracle 数据库中执行它,我会收到以下错误:

SQL Error: ORA-01779: cannot modify a column which maps to a non key-preserved table
01779. 00000 -  "cannot modify a column which maps to a non key-preserved table"
*Cause:    An attempt was made to insert or update columns of a join view which
           map to a non-key-preserved table.
*Action:   Modify the underlying base tables directly

MySQL 查询:

UPDATE  T1 
  INNER JOIN  T2 ON  T1.UIDPK =T2.UIDFK
  SET T1.C1=CONCAT('EMPTY_',T2.UID) WHERE T2.C1 IS NULL ;

更改了对 Oracle 的查询:

 UPDATE 
(
 SELECT T1.C1 AS OLD ,CONCAT('EMPTY_',T2.UID) AS NEW FROM  T1 
 INNER JOIN  T2 ON T1.UIDPK= T2.UIDFK WHERE T1.C1 IS NULL
) T3
SET T3.OLD = T3.NEW

以上查询在 Oracle 数据库中不起作用。

【问题讨论】:

    标签: sql oracle sql-update inner-join


    【解决方案1】:

    仅当您的 Oracle 版本确定别名为 T3 的子查询是可更新视图时,您使用的更新语法才有效。您可以使用相关子查询来代替:

    UPDATE T1
    SET C1 = (SELECT CONCAT('EMPTY_', T2.UID) FROM T2
              WHERE T1.UIDPK = T2.UIDFK AND T2.C1 IS NULL);
    

    【讨论】:

      【解决方案2】:

      您还可以检查T2.UIDFKT1.UIDP 列上是否有索引。

      如果没有,请创建它们,之后您的更新可能会起作用。

      在这些列上没有索引会导致此错误/限制。

      注意:

      您始终可以在此更新后删除这些索引,尽管它们似乎分别用作外键和主键列,并且在这些列上创建 FK 和 PK 约束总是好的(这将也会导致这些列上的现有索引)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-03
        • 2018-01-22
        • 1970-01-01
        • 2012-03-20
        • 1970-01-01
        • 2018-04-09
        相关资源
        最近更新 更多