使用LEFT JOIN查看是否可更新?

时间:2017-09-04 12:23:05

标签: join view mariadb

根据MariaDB documentation,VIEW无法更新外部联接:

  

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

据我所知,"外连接"包括"左连接"和#34;正确加入",对吧? 但是当我测试它时(在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;

1 个答案:

答案 0 :(得分:0)

ChangeLogs中的一些条目。 (这对于评论来说太长了;也许答案被埋在其中一个链接中。)

----- 2015-08-03 5.7.8发布候选人 - 修正了错误 - -----

如果在SET和JOIN子句中使用相同列的视图的多表UPDATE(/doc/refman/5.7/en/update.html)被用作准备,则可以引发断言声明。 (Bug#76962,Bug#21045724) http://bugs.mysql.com/bug.php?id=76962

----- 2015-03-09 5.7.6里程碑16 - 优化工具说明 - -----

要处理派生表(FROM子句中的子查询)或视图引用,... mysql> SET optimizer_switch = 'derived_merge=off'; ... http://bugs.mysql.com/bug.php?id=59203

----- 2015-06-04 MariaDB 10.1.5& 2015-05-07 MariaDB 10.0.18& 2015-05-01 MariaDB 5.5.43 - - -----

MDEV-7613:更新表上的MariaDB 5.5.40服务器崩溃左侧与视图连接 http://localhost/kb/en/mariadb-5540-release-notes/

----- 2009-12-07 5.5.0里程碑2& 2009-10-06 5.1.40 - 错误修复 - -----

涉及自然连接和可合并视图的多表UPDATE(http://dev.mysql.com/doc/refman/5.5/en/update.html)引发了一个断言。 (缺陷#47150) http://bugs.mysql.com/bug.php?id=47150

注意:5.5早于MariaDB 10.1,应该包含修复; 5.7之后,所以它不会在10.1中。