我正在学习使用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>
感谢您的时间。
答案 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更新) 如果语句也满足,则可更新视图是可插入的 视图列的这些附加要求:
必须没有重复的视图列名称。
视图必须包含基表中没有的所有列 默认值。
视图列必须是简单的列引用。他们一定不是 表达式,例如: