【问题标题】:I can't update from a view with an outer join我无法从具有外部联接的视图中更新
【发布时间】:2018-07-01 15:42:12
【问题描述】:

我正在使用 MySQL 学习 SQL,但当我尝试从具有外连接的视图更新时遇到问题

这是一个例子:

DROP TABLE IF EXISTS t1;
CREATE TABLE IF NOT EXISTS t1 (
  id tinyint(3) UNSIGNED NOT NULL AUTO_INCREMENT,
  t2_id tinyint(3) UNSIGNED DEFAULT NULL,
  col3 varchar(255) NOT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO t1 (id, t2_id, col3) VALUES
(1, 1, 'a'),
(2, 1, 'b'),
(3, 2, '3'),
(4, 2, '7'),
(5, NULL, '!');

DROP TABLE IF EXISTS t2;
CREATE TABLE IF NOT EXISTS t2 (
  id tinyint(3) UNSIGNED NOT NULL AUTO_INCREMENT,
  col2 varchar(255) NOT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO t2 (id, col2) VALUES
(1, 'Character'),
(2, 'Number');

CREATE OR REPLACE
VIEW v_t1_details
AS SELECT t1.id, t2.col2, t1.col3
FROM t1
LEFT JOIN t2 ON t1.t2_id = t2.id;

我使用的是 MySQL 5.7(5.7.14 和 5.7.19,在两个版本之间完全卸载并重新安装),当我使用此查询时会发生以下情况:

UPDATE v_t1_details SET col3 = 'c' WHERE id = 2;

#1288 - The target table v_t1_details of the UPDATE is not updatable

我知道不可能在插入请求中使用外连接,但我在我的课程或 MySQL 文档中没有看到类似的更新,所以我想知道它为什么不起作用。

感谢您的宝贵时间。

【问题讨论】:

    标签: mysql join outer-join sql-view


    【解决方案1】:

    您无法更新 SQL VIEW - 一般而言

    https://en.wikipedia.org/wiki/View_(SQL)

    在数据库中,视图是对数据的存储查询的结果集, 数据库用户可以像在持久化中一样查询 数据库集合对象。这个预先建立的查询命令被保留 在数据库字典中。不同于普通的基表 关系数据库,视图不构成物理模式的一部分: 作为结果集,它是一个计算或整理的虚拟表 当访问该视图时动态地从数据库中的数据 请求。

    https://www.codeproject.com/Tips/639239/Creating-and-Usage-of-View-in-SQL

    视图是虚拟的,视图中的数据不是物理存储的。它 是一组查询,当应用于一个或多个表时, 作为对象存储在数据库中。一个视图封装了名称 桌子。一个虚拟表包含多个列和数据 表格。

    但感谢@Thibaut,事实上你可以使用 mySQL 但有一定的限制

    https://dev.mysql.com/doc/refman/5.7/en/view-updatability.html

    关于可插入性(可通过 INSERT 更新 语句),一个可更新的视图是可插入的,如果它也满足 视图列的这些额外要求:

    视图列名不能重复。

    视图必须包含基表中没有 默认值。

    视图列必须是简单的列引用。他们一定不是 表达式,例如:

    【讨论】:

    • 哇.... MySQL 已经扩展了它的功能,但甚至无法获得可用的 row_number 功能。几率是多少。
    • 这是否意味着我必须遵守插入条件才能更新?
    • 你要按照规则为你更新mySql中的一个视图
    • 从第一个开始。所有列都应具有相同的名称
    猜你喜欢
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 2012-08-04
    • 2013-07-24
    相关资源
    最近更新 更多