Join 具有左连接的视图是否可更新?

Join 具有左连接的视图是否可更新?,join,view,mariadb,Join,View,Mariadb,根据,视图不能有可更新的外部联接: 如果视图使用以下任一项,则无法将其用于更新: ... 外部连接 据我所知,“外接”包括“左接”和“右接”,对吗? 但是当我测试它时(在mariaDB v10.1.25中),它是可更新的!我错过了什么 DROP TABLE IF EXISTS t1,t2; CREATE TABLE t1(id INT, a TEXT); INSERT INTO t1(id,a) VALUES (1,'a'),(2,'b'),(3,'c'); CREATE TABLE t2(

根据,视图不能有可更新的外部联接:

如果视图使用以下任一项,则无法将其用于更新: ... 外部连接

据我所知,“外接”包括“左接”和“右接”,对吗? 但是当我测试它时(在mariaDB v10.1.25中),它是可更新的!我错过了什么

DROP TABLE IF EXISTS t1,t2;

CREATE TABLE t1(id INT, a TEXT);
INSERT INTO t1(id,a) VALUES (1,'a'),(2,'b'),(3,'c');

CREATE TABLE t2(id INT, b TEXT);
INSERT INTO t2(id,b) VALUES (1,'+'),(1,'-'),(2,'*');

CREATE OR REPLACE VIEW v1 AS SELECT * FROM t1 LEFT JOIN t2 USING(id);

#UPDATE v1 SET a='x' WHERE id=3; # worked
#UPDATE v1 SET a='y' WHERE b IS NULL; # worked
#UPDATE v1 SET b='y' WHERE b IS NULL; # worked! even so, it does not make sense and does not update anything

SELECT * FROM t1;
SELECT * FROM t2;

变更日志中的某些条目。(这篇文章太长,无法发表评论;也许答案隐藏在其中一个链接中。)

-----2015-08-03 5.7.8候选版本--修复了bug-------

如果视图的多表更新(/doc/refman/5.7/en/UPDATE.html)在SET和JOIN子句中使用了相同的列,并将其用作准备语句,则可能引发断言。(臭虫76962,臭虫21045724)

-----2015-03-09 5.7.6里程碑16——优化器注释-------

要处理派生表(FROM子句中的子查询)或视图引用。。。
mysql>设置优化器_开关='derived_merge=off'。。。

-----2015-06-04马里亚行10.1.5和2015-05-07马里亚行10.0.18和2015-05-01马里亚行5.5.43-------

MDEV-7613:MariaDB 5.5.40更新表左连接视图时服务器崩溃

-----2009年12月07日5.5.0里程碑2和2009年10月06日5.1.40——错误修复-------

涉及自然联接和可合并视图的多表更新()引发了一个断言。(Bug#47150)


注:5.5早于MariaDB 10.1,应包括修复;5.7紧随其后,因此它不会出现在10.1中。

我猜MySQL(或mariadb)能够使用合并算法创建视图,并取代外部连接限制。但是我想说这是MySQL/mariadb开发人员的问题。我在phpmyadmin.net的演示站点中尝试了您的查询,它确实返回了预期的错误消息(#1288-更新的目标表v1不可更新)。那么,你可以更具体地说,你测试过你的查询所针对的是哪个MySQL或mariadb版本吗?如果我将数据库更改为mariadb,那么查询就通过了。因此,MySQL的行为与广告中的一样,但mariadb没有。那么,让我们从问题中删除MySQL。好的!我也删除了mysql标签。这取决于mariaDB的版本吗?我不知道。phmyadmin.net演示使用
10.1.26 MariaDB-0+deb9u1
,但文档中没有提到任何版本依赖关系。所以,恐怕你还需要问问mariadb的开发者。顺便说一句,在mariadb中检查:视图的算法是未定义的-关于我使用合并的理论太多了。。。