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.