我无法从具有外部联接的视图更新

时间:2018-01-22 22:24:09

标签: mysql join outer-join sql-view

我正在学习使用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文档中没有看到类似的内容进行更新,所以我想知道为什么它不起作用。< / p>

感谢您的时间。

1 个答案:

答案 0 :(得分:0)

您无法更新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更新)   如果语句也满足,则可更新视图是可插入的   视图列的这些附加要求:

     

必须没有重复的视图列名称。

     

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

     

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