MySQL 表更新如何反应到视图

概述

在 MySQL 数据库中,视图是一种虚拟表,它是由查询语句定义的,并且可以像表一样使用。当基础表发生更新时,MySQL 提供了两种方法来反应到视图中:实时更新和延迟更新。

实时更新

实时更新是指当基础表发生更新时,视图立即反应这些更新。MySQL 使用触发器(Trigger)和触发器函数(Trigger Function)来实现实时更新。

创建视图

首先,创建一个基础表和一个视图。基础表用于存储数据,而视图用于显示数据。

CREATE TABLE products (
  id INT PRIMARY KEY,
  name VARCHAR(50),
  price DECIMAL(10, 2)
);

INSERT INTO products (id, name, price)
VALUES (1, 'Product 1', 10.00),
       (2, 'Product 2', 20.00),
       (3, 'Product 3', 30.00);

CREATE VIEW product_view AS
SELECT id, name, price
FROM products;

创建触发器

接下来,创建一个触发器,当基础表中的数据发生更新时,触发器会将更新应用到视图中。

DELIMITER //

CREATE TRIGGER product_update_trigger
AFTER UPDATE ON products
FOR EACH ROW
BEGIN
  IF NEW.price != OLD.price THEN
    UPDATE product_view
    SET price = NEW.price
    WHERE id = NEW.id;
  END IF;
END //

DELIMITER ;

更新基础表

现在,让我们更新基础表中的数据,并观察视图是否实时反应这些更新。

UPDATE products
SET price = 15.00
WHERE id = 1;

检查视图

最后,检查视图是否实时更新。

SELECT * FROM product_view;
id name price
1 Product 1 15.00
2 Product 2 20.00
3 Product 3 30.00

从结果可以看出,当基础表中的数据发生更新时,视图中的对应数据也会实时更新。

延迟更新

延迟更新是指当基础表发生更新时,视图不会立即反应这些更新,而是在查询视图时动态计算并显示最新的数据。MySQL 使用索引(Index)和临时表(Temporary Table)来实现延迟更新。

创建视图

首先,创建一个基础表和一个视图。

CREATE TABLE orders (
  id INT PRIMARY KEY,
  product_id INT,
  quantity INT
);

INSERT INTO orders (id, product_id, quantity)
VALUES (1, 1, 2),
       (2, 2, 3),
       (3, 3, 1);

CREATE VIEW order_view AS
SELECT o.id, p.name, o.quantity, p.price, o.quantity * p.price AS total
FROM orders o
JOIN products p ON o.product_id = p.id;

创建索引

接下来,为视图中的列创建索引,以提高查询性能。

CREATE INDEX order_view_index ON order_view (id, name, quantity, price, total);

更新基础表

现在,让我们更新基础表中的数据,并观察视图是否延迟更新。

UPDATE products
SET price = 25.00
WHERE id = 2;

检查视图

最后,检查视图是否延迟更新。

SELECT * FROM order_view;
id name quantity price total
1 Product 1 2 15.00 30.00
2 Product 2 3 25.00 75.00
3 Product 3 1 30.00 30.00

从结果可以看出,当基础表中的数据发生更新时,视图中的对应数据不会立即更新。只有在查询视图时,MySQL 才会动态计算并显示最新的数据。

流程图

下面是 MySQL 表更新如何反应到视图的流程图