对于 单表的
视图, 插入/修改
数据是没有问题的。 (只要你不做特别的设置)\x0d\x0a\x0d\x0a对于多表的视图, *** 作的时候,会存在一定的问题。\x0d\x0a\x0d\x0a下面是一个例子:\x0d\x0a\x0d\x0a1>CREATE VIEW v_main_sub AS\x0d\x0a2>SELECT\x0d\x0a3> test_main.id AS main_id,\x0d\x0a4> test_main.value AS main_value,\x0d\x0a5> test_sub.id AS sub_id,\x0d\x0a6> test_sub.value AS sub_value\x0d\x0a7>FROM\x0d\x0a8> test_main, test_sub\x0d\x0a9>WHERE\x0d\x0a10> test_main.id = test_sub.main_id\x0d\x0a11>go\x0d\x0a\x0d\x0a1>SELECT * FROM v_main_sub\x0d\x0a2>go\x0d\x0amain_id main_value sub_id sub_value\x0d\x0a----------- ---------- ----------- ----------\x0d\x0a 1 ONE 1 ONEONE\x0d\x0a 2 TWO 2 TWOTWO\x0d\x0a\x0d\x0a(2 行受
影响)\x0d\x0a\x0d\x0a1>UPDATE v_main_sub\x0d\x0a2>SET main_value='ONX'\x0d\x0a3>WHERE main_id = 1\x0d\x0a4>go\x0d\x0a\x0d\x0a(1 行受影响)\x0d\x0a\x0d\x0a1>UPDATE v_main_sub\x0d\x0a2>SET sub_value='ONXONX'\x0d\x0a3>WHERE main_id = 1\x0d\x0a4>go\x0d\x0a\x0d\x0a(1 行受影响)\x0d\x0a\x0d\x0a1>DELETE FROM v_main_sub WHERE main_id = 1\x0d\x0a2>go\x0d\x0a消息 4405,级别 16,状态 1,服务器 GMJ-PC\SQLEXPRESS,第 1 行\x0d\x0a视图或函数 'v_main_sub' 不可更新,因为修改会影响多个基表。\x0d\x0a\x0d\x0a-- 这个触发器, 只测试输出, 不删除数据。\x0d\x0a1>CREATE TRIGGER v_main_sub_trigger\x0d\x0a2>ON v_main_sub\x0d\x0a3>INSTEAD OF DELETE\x0d\x0a4>AS\x0d\x0a5>DECLARE\x0d\x0a6> @main_id INT,\x0d\x0a7> @sub_id INT\x0d\x0a8>BEGIN\x0d\x0a9> SELECT @main_id=main_id, @sub_id=sub_id FROM deleted\x0d\x0a10>\x0d\x0a11>\x0d\x0a12> PRINT(@main_id)\x0d\x0a13> PRINT(@sub_id)\x0d\x0a14>END\x0d\x0a15>go\x0d\x0a\x0d\x0a1>DELETE FROM v_main_sub WHERE main_id = 1\x0d\x0a2>go\x0d\x0a1\x0d\x0a1\x0d\x0a\x0d\x0a(1 行受影响)\x0d\x0a1>DELETE FROM v_main_sub WHERE sub_id = 1\x0d\x0a2>go\x0d\x0a1\x0d\x0a1\x0d\x0a\x0d\x0a(1 行受影响)\x0d\x0a\x0d\x0a对于多表关联的视图, 删除的时候,需要人为的去判断\x0d\x0a例如当 主表 和 子表,都只有一条记录的情况下。\x0d\x0a无法判断 本次删除, 是要删除掉一个子表的记录,留下主表的。\x0d\x0a还是 主表 子表的数据,一同删除。
1、视图(View)创建使用,视图(View)实际上是一张或者多张表上的预定义查询,这些表称为基表。从视图中查询信息与从表中查询信息的方法完全相同。只需要简单的SELECT?FROM即可。
2、OR REPLACE:如果视图已经存在,则替换旧视图。
3、FORCE:即使基表不存在,也可以创建该视图,但是该视图不能正常使用,当基表创建成功后,视图才能正常使用。
4、NOFORCE:如果基表不存在,无法创建视图,该项是默认选项。
5、 WITH READ ONLY:默认可以通过视图对基表执行增删改 *** 作,但是有很多在基表上的限制(比如:基表中某列不能为空,但是该列没有出现在视图中,则不能通过视图执行insert *** 作),WITH READ ONLY说明视图是只读视图,不能通过该视图进行增删改 *** 作。现实开发中,基本上不通过视图对表中的数据进行增删改 *** 作。
视图具有以下优点:可以限制用户只能通过视图检索数据。这样就可以对最终用户屏蔽建表时底层的基表。可以将复杂的查询保存为视图。可以对最终用户屏蔽一定的复杂性。 限制某个视图只能访问基表中的部分列或者部分行的特定数据。这样可以实现一定的安全性。从多张基表中按一定的业务逻辑抽出用户关心的部分,形成一张虚拟表。
视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
当建立视图时使用的表中的数据发生了改变后,视图中的数据也会发生相应的改变,视图本身是不能执行添加,删除,修改的!
如果要插入新数据的话,建议使用触发器,在视图相对应的各表中插入数据。视图中自然更新。
评论列表(0条)