Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

ลบแถวจาก View ใน MySQL จะลบจาก Base Table ด้วยหรือไม่?


คำตอบสั้น: ใช่ ลบจาก 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 จริง