【问题标题】:Unable to update view - The target table of the UPDATE is not updateable无法更新视图 - UPDATE 的目标表不可更新
【发布时间】:2021-10-13 23:33:48
【问题描述】:

我有一个视图 (v_licence_data),其构造如下:

SELECT "licences"."user_id"             AS "user_id",
       "licences"."licence_id"          AS "licence_id",
       "licences"."licence_created"     AS "licence_created",
       "licences"."licence_expiry"      AS "licence_expiry",
       "licences"."licence_key"         AS "licence_key",
       "licences"."machine_id"          AS "machine_id",
       "users"."email"                  AS "email",
       "users"."first_name"             AS "first_name",
       "users"."last_name"              AS "last_name",
       "users"."date_created"           AS "date_created",
       "machines"."machine_fingerprint" AS "machine_fingerprint",
       "licences"."id"                  AS "id"
FROM   (("licences"
         LEFT JOIN "users"
                ON(( "licences"."user_id" = "users"."id" )))
        LEFT JOIN "machines"
               ON(( "licences"."machine_id" = "machines"."id" ))) 

我正在尝试在视图上做一个UPDATE:

UPDATE v_licence_data
SET email = 'test'
WHERE licence_id = '6787C1-07B5F5-CDC649-28D156-A8706B-V3'

但是我收到以下错误:The target table v_licence_data of the UPDATE is not updatable

我已阅读Updatable and Insertable Views 文档,并且我相信我的视图满足成为可更新视图的所有条件。

我该如何解决这个问题?提前致谢。

【问题讨论】:

  • 外部(左)连接是问题,在您发布的链接中提到。

标签: mysql sql view sql-update


【解决方案1】:

Updatable and Selectable Views documentation 声明多表视图只有在独占使用INNER JOINS 时才能更新:

假设可以使用MERGE 算法对其进行处理,有时可以更新多表视图。为此,视图必须使用inner join(而不是outer join 或UNION)。此外,视图定义中只能更新单个表,因此SET 子句必须仅命名视图中的一个表中的列。

因此,除非您能够更改视图,否则您唯一的选择就是直接更新表格。这将允许您使用LEFT JOIN:

   UPDATE licenses l
LEFT JOIN users u
       ON l.user_id = u.id
      SET u.email = 'test'
    WHERE l.license_id = '6787C1-07B5F5-CDC649-28D156-A8706B-V3'

见db<>fiddle。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-19
    • 2016-02-07
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    相关资源
    最近更新 更多