视图到底能不能进行增删改

花儿谢了后3 2014-06-11 04:58:54
本来印象中视图是不能的 刚刚百度了下 发现单表视图可以进行update 这之间到底是 什么关系 求大神
...全文
8893 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
zbdzjx 2014-06-12
  • 打赏
  • 举报
回复
个人感觉: 视图增行增改,主要是看视图里面的语句,能不能判断出一个主要的表,这个表还要有主键。 例如:from a left join b left join c 或 from a, b, c 上面这两种,如果表a有主键,而且增改的数据都是表a的,这样就可以增改。 也就是说,虽然是对视图进行操作,但最终实际操作的只是一个表中能够准确定位的记录。 但删除有些特殊,上面两个语句,如果删除,有时会将三个表中相关的数据全部删除掉。
以学习为目的 2014-06-12
  • 打赏
  • 举报
回复
引用 楼主 u012581162 的回复:
本来印象中视图是不能的 刚刚百度了下 发现单表视图可以进行update 这之间到底是 什么关系 求大神
你可以以我17楼的代码为基础来测试下,然后执行看下提示,然后在使用我20的代码再测试下,就明白了
以学习为目的 2014-06-12
  • 打赏
  • 举报
回复
多表联合也是可以的,不过每个表都必须有分区列。关于分区列的定义,简单的说就是每个表都有一个列,此列必须是主键值,而且不为空,且必须是有check约束,并且每个表的分区列的check约束范围不重叠。下面的例子就是以ID 为分区列,在2005版本下测试是可以更新视图的。
IF OBJECT_ID('tb') IS  NOT NULL
DROP TABLE tb
CREATE TABLE tb (ID INT  CHECK (ID BETWEEN '1' AND '2')PRIMARY KEY NOT NULL,col1 INT ,col2 INT)
INSERT INTO tb
SELECT     '1','1','2' UNION ALL
SELECT     '2' ,'3','4' 

IF OBJECT_ID('tb_a') IS  NOT NULL
DROP TABLE tb_a

CREATE TABLE tb_a (ID INT CHECK (ID BETWEEN  '3' AND '4')PRIMARY KEY NOT NULL ,col1 INT ,col2 INT)
INSERT INTO tb_a
SELECT '3','11','22' UNION ALL
SELECT  '4' ,'33','44' 

SELECT  *  FROM  tb
SELECT  * FROM tb_a


--DROP VIEW view_tb_a

CREATE VIEW  view_tb_a
AS
SELECT  * FROM tb
UNION ALL
SELECT  *  FROM tb_a

SELECT  *  FROM view_tb_a

UPDATE view_tb_a SET col1=1 WHERE ID=1
KevinLiu 2014-06-12
  • 打赏
  • 举报
回复
单表示可以的。
卖水果的net 2014-06-12
  • 打赏
  • 举报
回复
有的视图可以更新,有的不能更新。
以学习为目的 2014-06-12
  • 打赏
  • 举报
回复
USE [GTS]
GO
/****** 对象:  Table [dbo].[tb]    脚本日期: 06/12/2014 08:57:38 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF OBJECT_ID('tb') IS  NOT NULL
DROP TABLE TB
CREATE TABLE tb (col1 INT,col2 INT)
INSERT INTO tb
SELECT  '1','2' UNION ALL
SELECT  '3','4' 

IF OBJECT_ID('tb_a') IS  NOT NULL
DROP TABLE tb_a
CREATE TABLE tb_a (col1 INT,col2 INT)
INSERT INTO tb_a
SELECT  '11','22' UNION ALL
SELECT  '33','44' 

--SELECT  *  FROM  tb
--SELECT  * FROM tb_a

CREATE VIEW  view_tb_a
AS
SELECT  * FROM tb
UNION ALL
SELECT  *  FROM tb_a

---SELECT  *  FROM view_tb_a

UPDATE view_tb_a SET col1=0 WHERE col1=1

/*UNION ALL 视图 'GT.dbo.view_tb_a' 不可更新,因为在表 '[GT].[dbo].[tb]' 上没有找到主键。*/
rfq 2014-06-12
  • 打赏
  • 举报
回复
可以 ,视图更新有好多条件,视图才可以更新 。
Neo_whl 2014-06-11
  • 打赏
  • 举报
回复
1、插入记录 通过视图插入数据与直接向表中插入数据一样,但通过视图插入数据时引用的字段为视图中的字段,和表中字段不一定完全相同,故有如下规则: 1)使用插入语句的用户必须拥有在基本表中插入数据的权限。 2)若视图中未包括基表中属性为NOT NULL的字段时,操作失败。 3)若基表中的字段因规则或约束而不接受,从视图插入的数据操作失败。 4)若视图中包含有统计函数结果或多个字段值的组合,操作失败。 5)若视图中使用了distinct,group by短句,操作失败。 6)若视图中使用with check option,则操作失败。因为插入新记录时,即使该记录不满足创建视图时定义的限制条件,仍然可以向表中插入数据记录,但通过视图查询数据时不会显示出新插入的记录。若想防止插入不符合视图定义的数据可使用WITH CHECK OPTION选项来进行限制。 7)对多表连接的视图来讲,一个插入语句只能对单独某个表的字段进行操作。 2、修改数据:同数据表的修改 3、删除记录 同数据表的删除操作,但就注意如下: 1)通过视图删除数据将最终体现为从基表中删除数据。 当一个视图由两个以上基表构成时,不允许删除视图中的数据。 2)若视图中的字段是常数或统计结果的话,允许执行delete操作,但不允许insert或update操作。 绝大部分我已经测试过,环境为05,仅供参考!
唐诗三百首 2014-06-11
  • 打赏
  • 举报
回复
虽然视图可以更新,但不建议在实际应用中使用.
唐诗三百首 2014-06-11
  • 打赏
  • 举报
回复
引用 6 楼 u012581162 的回复:
能否举个例子?什么样的视图可以?
参考 http://www.cnblogs.com/xdpxyxy/archive/2013/04/28/SqlServer.html
专注or全面 2014-06-11
  • 打赏
  • 举报
回复
以前试过 对视图的增删改要映射到基本表中, 比如一个视图是三张表生成的,你要delete的话,id归属于到那个表,就删除的那个表的数据 insert的话inert into viewName (表1的列1,表1的列2,表1的列3)这样子,且满足基础表的约束要求
發糞塗牆 2014-06-11
  • 打赏
  • 举报
回复
不用举例子啊,你建个视图再update视图就知道拉。
yoan2014 2014-06-11
  • 打赏
  • 举报
回复
我还看过一篇文章通过视图的方式在标准版中实现类似分区表的功能
花儿谢了后3 2014-06-11
  • 打赏
  • 举报
回复
引用 2 楼 xxzxwsx 的回复:
好像多表视图有时也可更新,有更新触发器的就更不用说了
多表也可以?
花儿谢了后3 2014-06-11
  • 打赏
  • 举报
回复
引用 4 楼 DBA_Huangzj 的回复:
2000不行,2008及以上可以,2005暂时没环境测试,但是实际上还是对底层表进行更改,并且有一定的限制
能举个例子吗 多谢版主
chen357313771 2014-06-11
  • 打赏
  • 举报
回复
学习。。。。
花儿谢了后3 2014-06-11
  • 打赏
  • 举报
回复
引用 3 楼 ap0405140 的回复:
视图实际上是可更新的,这与教科书上的理论定义有点出入.
能否举个例子?什么样的视图可以?
  • 打赏
  • 举报
回复
学习。。。。。
發糞塗牆 2014-06-11
  • 打赏
  • 举报
回复
2000不行,2008及以上可以,2005暂时没环境测试,但是实际上还是对底层表进行更改,并且有一定的限制
唐诗三百首 2014-06-11
  • 打赏
  • 举报
回复
视图实际上是可更新的,这与教科书上的理论定义有点出入.
加载更多回复(2)

34,837

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧