-- 创建各个成员表(客户~客户)
-- “客户编号”字段将是分区字段,它会被定义为主键,
-- 并应用一个CHECK 约束来决定成员表所存储的数据范围。
CREATE TABLE 客户1(客户编号 int PRIMARY KEY CHECK (客户编号 BETWEEN 1 and 100),公司名称 nvarchar(50))
CREATE TABLE 客户2(客户编号 int PRIMARY KEY CHECK (客户编号 BETWEEN 101 and 200),公司名称 nvarchar(50))
CREATE TABLE 客户3(客户编号 int PRIMARY KEY CHECK (客户编号 BETWEEN 201 and 300),公司名称 nvarchar(50))
CREATE TABLE 客户4(客户编号 int PRIMARY KEY CHECK (客户编号 BETWEEN 301 and 400),公司名称 nvarchar(50))
-- 创建一个由各个客户表所组成的本地分区视图
CREATE VIEW v_所有客户 AS
SELECT * FROM 客户1 UNION ALL  
SELECT * FROM 客户2 UNION ALL
SELECT * FROM 客户3 UNION ALL  
SELECT * FROM 客户4
-- 添加数据记录到本地分区视图vw_所有客户
go
select * from dbo.v_所有客户
select * from dbo.客户1
select * from dbo.客户2
select * from dbo.客户3
select * from dbo.客户4
go
INSERT v_所有客户(客户编号,公司名称) VALUES (1, '章立民工作室')
INSERT v_所有客户(客户编号,公司名称) VALUES (2, '章立民工作室')
INSERT v_所有客户(客户编号,公司名称) VALUES (75, '飞狐工作室')
INSERT v_所有客户(客户编号,公司名称) VALUES (100, '小林汽车保养厂')
INSERT v_所有客户(客户编号,公司名称) VALUES (121, '洪志豪信息小天地')
INSERT v_所有客户(客户编号,公司名称) VALUES (180, '周时恕数据库园地')
INSERT v_所有客户(客户编号,公司名称) VALUES (221, '章舒涵儿童计算机绘画')
INSERT v_所有客户(客户编号,公司名称) VALUES (242, '吴孟如舞蹈教室')
INSERT v_所有客户(客户编号,公司名称) VALUES (375, '洪雯卿外语编译中心')
INSERT v_所有客户(客户编号,公司名称) VALUES (321, '章老师数据库规划咨询中心')
go虽然从视图中插入数据不是很靠谱,但是还是想弄清楚这个疑问:
delete from dbo.客户4 where 客户编号 in (select 客户编号 from 客户4) --相当于delete from dbo.客户4delete from dbo.v_所有客户 where 客户编号 in (select  dbo.客户4.客户编号 from 客户4)--不可行,为什么???
go
delete from dbo.v_所有客户--为客户4这个表创建一个视图
--create view v_kh4
--as 
--select * from dbo.客户4
go
select * from v_kh4
--从视图中删除客户4表中的所有信息
delete from v_kh4 where 客户编号 in (select dbo.客户4.客户编号 from dbo.客户4)--可行!为什么???
go
--在Standard Edition版本中如此,Express Edition版本中也是,Developer Edition呢?
--从这里可看出,分区视图跟视图的区别在哪?--drop view dbo.v_所有客户
--drop view dbo.v_kh4
--drop table dbo.客户1
--drop table dbo.客户2
--drop table dbo.客户3
--drop table dbo.客户4

解决方案 »

  1.   

    分区视图跟视图的区别在哪?区别还是有一些的,比如:
    在对分区视图进行insert/update/delete时,不能与分区视图自身及分区视图的成员表 进行自联接。
    对于普通视图,则没有这个限制.以下这句不可行:
    delete from dbo.v_所有客户 where 客户编号 in (select dbo.客户4.客户编号 from 客户4)
    --就是因为delete时与其成员表进行了自联接(从形式上看好像是子查询,但SQL会将这个语句解析成联接)。同样的原因,下面这句也不可行。
    update dbo.v_所有客户 set 公司名称 = '' where 客户编号 in (select dbo.客户4.客户编号 from 客户4)楼主,记得结贴哦
      

  2.   

     那个check约束就分区的约束。并且这个约束必须是主键中的第一个字段。
      

  3.   

    视图“dbo.v_所有客户”对表(客户1,客户2,客户3,客户4)引用,执行以下的语句语法通过
    delete from dbo.v_所有客户 where 客户编号 in (select dbo.客户4.客户编号 from 客户4)
    但是会报错:
    消息 4439,级别 16,状态 6,第 1 行
    分区视图 'OnclassDemo.dbo.v_所有客户' 不可更新,因为源查询中包含对分区表 '[OnclassDemo].[dbo].[客户4]' 的引用。

    视图“v_kh4”只对表(客户4)引用,执行以下语句却能成功:
    delete from v_kh4 where 客户编号 in (select dbo.客户4.客户编号 from dbo.客户4)--可行!
    同样是从表客户4里选出所有数据来删除,为什么分区视图的却会报错?
    虽然这个问题在开发中是不会出现,一般也只从表中插入数据,而不是从视图...
    但还是想弄明白这个问题,小弟求教了
      

  4.   

    何为自联接呢?比如:
    delete from dbo.客户4 where 客户编号 in (select 客户编号 from 客户4) --相当于delete from dbo.客户4
    也算自联接吧?
    分区视图给的这个约束让我感觉是自己拿石头档自己路一样,这个约束是针对什么设计的啊?