คำตอบสั้น: ใช่ ลบจาก View = ลบจาก Base Table
View ใน MySQL เป็น updatable view (ถ้าไม่มี aggregation, join, subquery, distinct, etc.) การ DELETE/UPDATE/INSERT บน View จะส่งผลต่อ Base Table ตรงๆ
ตัวอย่างยืนยัน
1. สร้าง Base Table
mysql> create table deleteFromBaseTableDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> Name varchar(20)
-> );
Query OK, 0 rows affected (0.83 sec)
2. เพิ่มข้อมูล
mysql> insert into deleteFromBaseTableDemo(Name) values('John');
Query OK, 1 row affected (0.18 sec)
mysql> insert into deleteFromBaseTableDemo(Name) values('Carol');
Query OK, 1 row affected (0.15 sec)
mysql> insert into deleteFromBaseTableDemo(Name) values('Bob');
Query OK, 1 row affected (0.14 sec)
mysql> insert into deleteFromBaseTableDemo(Name) values('Sam');
Query OK, 1 row affected (0.14 sec)
3. สร้าง View
mysql> create view delete_view as select Id, Name from deleteFromBaseTableDemo; Query OK, 0 rows affected (0.17 sec)
4. ดูข้อมูลใน View
mysql> select * from delete_view;
+----+-------+ | Id | Name | +----+-------+ | 1 | John | | 2 | Carol | | 3 | Bob | | 4 | Sam | +----+-------+
5. ลบจาก View (Id = 4)
mysql> delete from delete_view where Id = 4; Query OK, 1 row affected (0.26 sec)
6. ตรวจสอบ View - แถวหาย
mysql> select * from delete_view;
+----+-------+ | Id | Name | +----+-------+ | 1 | John | | 2 | Carol | | 3 | Bob | +----+-------+
7. ตรวจสอบ Base Table - แถวหายเช่นกัน!
mysql> select * from deleteFromBaseTableDemo;
+----+-------+ | Id | Name | +----+-------+ | 1 | John | | 2 | Carol | | 3 | Bob | +----+-------+
เงื่อนไข Updatable View (MySQL)
View ต้อง ไม่มี ต่อไปนี้:
- Aggregate functions (SUM, COUNT, etc.)
- DISTINCT
- GROUP BY / HAVING
- UNION / UNION ALL
- Subquery ใน SELECT list
- JOIN หลายตาราง (บางกรณี)
- Non-updatable view ใน FROM clause
- Subquery ใน WHERE ที่อ้างอิงตารางเดียวกับ view
ป้องกันการลบผ่าน View
1. สร้าง View แบบ READ ONLY (WITH CHECK OPTION)
CREATE VIEW safe_view AS SELECT * FROM base_table WHERE active = 1 WITH CHECK OPTION;
2. ใช้ Trigger ป้องกัน
CREATE TRIGGER prevent_delete_on_view
BEFORE DELETE ON base_table
FOR EACH ROW
BEGIN
IF @from_view = 1 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Cannot delete from view';
END IF;
END;
3. ใช้ GRANT เฉพาะ SELECT
GRANT SELECT ON view_name TO 'user'@'host';
สรุป: View ปกติใน MySQL updatable ได้ → ลบจาก View = ลบจาก Base Table จริง