mysql视图中可以删除数据吗_sql問題 删除视图中的数据,表中的数据会删除吗?

本文探讨了SQL视图中数据删除的行为,指出当视图未定义触发器时,删除视图数据将直接影响底层表。同时,通过一个例子展示了当视图有INSTEAD OF触发器但未包含删除操作时,删除操作不会影响表数据。在多表关联的视图中,删除操作需要谨慎处理,特别是在不确定是要删除子表记录还是主表记录时。文章还提供了一个触发器的示例,演示了如何在触发器中处理删除操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果你那个视图,是 单表的, 没写 触发器的。

那么 如果 删除视图中的数据 成功了,那么 表中的数据 就被删除了。

如果那个视图, 写了个 INSTEAD OF 触发器. 但是里面没有任何删除的动作。

那么 可能你 DELETE FROM 视图, 最后表的数据,一点也没变化, 也是可以的。

1> CREATE VIEW v_main_sub AS

2> SELECT

3> test_main.id AS main_id,

4> test_main.value AS main_value,

5> test_sub.id AS sub_id,

6> test_sub.value AS sub_value

7> FROM

8> test_main, test_sub

9> WHERE

10> test_main.id = test_sub.main_id;

11> go

1> SELECT * FROM v_main_sub;

2> go

main_id main_value sub_id sub_value

----------- ---------- ----------- ----------

1 ONE 1 ONEONE

2 TWO 2 TWOTWO

(2 行受影响)

1> UPDATE v_main_sub

2> SET main_value='ONX'

3> WHERE main_id = 1;

4> go

(1 行受影响)

1> UPDATE v_main_sub

2> SET sub_value='ONXONX'

3> WHERE main_id = 1;

4> go

(1 行受影响)

1> DELETE FROM v_main_sub WHERE main_id = 1;

2> go

消息 4405,级别 16,状态 1,服务器 GMJ-PC\SQLEXPRESS,第 1 行

视图或函数 'v_main_sub' 不可更新,因为修改会影响多个基表。

1> CREATE TRIGGER v_main_sub_trigger

2> ON v_main_sub

3> INSTEAD OF DELETE

4> AS

5> DECLARE

6> @main_id INT,

7> @sub_id INT;

8> BEGIN

9> SELECT @main_id=main_id, @sub_id=sub_id FROM deleted;

10>

11>

12> PRINT(@main_id);

13> PRINT(@sub_id);

14> END;

15> go

1> DELETE FROM v_main_sub WHERE main_id = 1;

2> go

1

1

(1 行受影响)

1> DELETE FROM v_main_sub WHERE sub_id = 1;

2> go

1

1

(1 行受影响)

对于多表关联的视图, 删除的时候,需要人为的去判断

例如当 主表 和 子表,都只有一条记录的情况下。

无法判断 本次删除, 是要删除掉一个子表的记录,留下主表的。

还是 主表 子表的数据,一同删除。

取消

评论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值