永发信息网

sql视图中如何插入新的数据

答案:3  悬赏:60  手机版
解决时间 2021-11-27 20:19
  • 提问者网友:欺烟
  • 2021-11-27 05:59
sql视图中如何插入新的数据
最佳答案
  • 五星知识达人网友:廢物販賣機
  • 2021-11-27 07:05
视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
当建立视图时使用的表中的数据发生了改变后,视图中的数据也会发生相应的改变,视图本身是不能执行添加,删除,修改的!
全部回答
  • 1楼网友:动情书生
  • 2021-11-27 08:47
确定你说的顺序没问题?要用pl/sql哈

假如是连接视图,那就要遵守基本更新准则了.现在我只对INSERT准则做一下说明:在INSERT语句中不能显式或隐式的引用到任何非码保留基础表中的字段,假如在定义视图中使用了WITH CHECK OPTION子句,那就不能对视图执行INSERT操作.
注:码保留表,非码保留表的解释:
在DEPT中,DEPT_NO是主码,EMP中,EMP_NO是主码
然后建立连接视图:
create view emp_dept as
select emp.emp_no,emp.emp_name,emp.dept_no,dept.name
from emp,dept
where emp.dept_no=dept.dept_no

这个视图中,EMP_NO仍然充当主码,所以EMP为码保留表,而DEPT中的DEPT_NO就不是主码了,所以为非码保留表.
多张表关联后需要向视图插入数据,建议使用替代触发器
create trigger [触发器名]
on [视图名]
instead of insert
as
begin
--声明变量;
--从inserted表中查出所有列的数据,分别赋给声明好的变量;
--用上面的数据向第一张表插入数据
--用上面的数据向第二张表插入数据
end
此外通过user_updatable_columns表能够查询到该表或者视图是否可更新。

如果对您有帮助,请记得采纳为满意答案,谢谢!祝您生活愉快!

vaela
  • 2楼网友:蓝房子
  • 2021-11-27 07:53
对于 单表的视图, 插入/修改 数据是没有问题的。 (只要你不做特别的设置)

对于多表的视图, 操作的时候,会存在一定的问题。

下面是一个例子:

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 行受影响)

对于多表关联的视图, 删除的时候,需要人为的去判断
例如当 主表 和 子表,都只有一条记录的情况下。
无法判断 本次删除, 是要删除掉一个子表的记录,留下主表的。
还是 主表 子表的数据,一同删除。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯