依赖于多个表的可更新视图

Cra*_*lus 2 mysql sql join view

Updateable ViewMySQL 中阅读:

更具体地说,如果视图包含以下任何一项,则该视图不可更新:....

某些连接(请参阅本节后面的其他连接讨论)

在那之后:

假设可以使用 MERGE 算法处理多表视图,有时可能会更新多表视图。为此,视图必须使用内连接(不是外连接或 UNION)。

但是没有明确的例子,我没有成功更新我创建的涉及NATURAL JOIN.

取决于multi-tables可更新的视图的示例是什么?什么时候不呢?

pet*_*erm 5

示例表架构

CREATE TABLE customers(customer_id INT, `name` VARCHAR(32));
CREATE TABLE orders(order_id INT, customer_id INT, order_date DATE);
Run Code Online (Sandbox Code Playgroud)

风景

CREATE VIEW vw_orders AS 
SELECT order_id, o.customer_id order_customer_id, c.customer_id, c.name customer_name, order_date
  FROM orders o INNER JOIN 
       customers c ON o.customer_id = c.customer_id;
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样插入

INSERT INTO vw_orders (customer_id, customer_name) VALUES (1, 'Customer1');
INSERT INTO vw_orders (order_id, order_customer_id, order_date) VALUES (1, 1, CURDATE());
Run Code Online (Sandbox Code Playgroud)

或更新

UPDATE vw_orders SET customer_name = 'Customer11' WHERE customer_id = 1;
Run Code Online (Sandbox Code Playgroud)

注意:您将无法使用单个语句在两个基础表中插入或更新值

这个说法

INSERT INTO vw_orders (customer_id, customer_name, order_id, order_customer_id, order_date) 
VALUES (2, 'Customer2', 2, 2, CURDATE());
Run Code Online (Sandbox Code Playgroud)

会因错误而失败

CREATE TABLE customers(customer_id INT, `name` VARCHAR(32));
CREATE TABLE orders(order_id INT, customer_id INT, order_date DATE);
Run Code Online (Sandbox Code Playgroud)