Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Xóa hàng từ VIEW có xóa hàng từ bảng gốc trong MySQL?

CÓ. Trong MySQL, xóa hàng từ VIEW có thể xóa hàng từ bảng gốc (base table) nếu view là updatable (có thể cập nhật).

Điều kiện VIEW updatable

View có thể UPDATE/DELETE/INSERT khi:

  • Không dùng: GROUP BY, DISTINCT, UNION, hàm tổng hợp (SUM, COUNT...)
  • Không dùng subquery trong SELECT
  • Không JOIN nhiều bảng (trừ một số trường hợp)
  • Tất cả cột không phải biểu thức tính toán
  • Cột khóa chính của bảng gốc có trong view

Ví dụ minh họa

Tạo bảng gốc:

mysql> CREATE TABLE deleteFromBaseTableDemo (
    -> Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> Name VARCHAR(20)
    -> );
Query OK, 0 rows affected (0.83 sec)

Chèn dữ liệu:

mysql> INSERT INTO deleteFromBaseTableDemo(Name) VALUES ('John'), ('Carol'), ('Bob'), ('Sam');

Tạo view đơn giản (updatable):

mysql> CREATE VIEW delete_view AS SELECT Id, Name FROM deleteFromBaseTableDemo;
Query OK, 0 rows affected (0.17 sec)

Xem view:

mysql> SELECT * FROM delete_view;
+----+-------+
| Id | Name  |
+----+-------+
| 1  | John  |
| 2  | Carol |
| 3  | Bob   |
| 4  | Sam   |
+----+-------+

Xóa từ view (Id=4):

mysql> DELETE FROM delete_view WHERE Id = 4;
Query OK, 1 row affected (0.26 sec)

Kiểm tra view (đã mất Sam):

mysql> SELECT * FROM delete_view;
+----+-------+
| Id | Name  |
+----+-------+
| 1  | John  |
| 2  | Carol |
| 3  | Bob   |
+----+-------+

Kiểm tra bảng gốc (cũng mất Sam!):

mysql> SELECT * FROM deleteFromBaseTableDemo;
+----+-------+
| Id | Name  |
+----+-------+
| 1  | John  |
| 2  | Carol |
| 3  | Bob   |
+----+-------+

View KHÔNG updatable (ví dụ)

CREATE VIEW non_updatable_view AS 
SELECT Name, COUNT(*) AS cnt FROM deleteFromBaseTableDemo GROUP BY Name;

Đây dùng GROUP BY → không thể DELETE/UPDATE.

Kiểm tra view có updatable không

SELECT TABLE_NAME, IS_UPDATABLE 
FROM INFORMATION_SCHEMA.VIEWS 
WHERE TABLE_SCHEMA = 'tên_db';

Kết luận: Cẩn thận khi DELETE/UPDATE trên view — nó tác động trực tiếp dữ liệu bảng gốc. Dùng trigger hoặc stored procedure nếu cần logic phức tạp.