免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2746 | 回复: 0
打印 上一主题 下一主题

db2数据库对象之约束 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-17 22:10 |只看该作者 |倒序浏览
约束是什么

约束是用来控制什么样的值可以存储在数据库中的机制

法律是什么
法律是用来控制什么样的行为可以发生在特定的社会环境中的机制

所以
凡是跟约束有关的
都是一种控制的思想
控制是为了规范和效率
否则
如果大家的行为都如同热分子一样的,那样
就是标准的无序
Rdbms
可是关系型的核心思想
这个世界上没有纯粹的无序

约束属于数据库的商务逻辑的一部分

越丰富的商务逻辑代表着我们越复杂的社会流的关系,也就是越复杂的数据之间的关联关系。

约束的种类
Unique
Referential
Check
Informational constraint

Unique 约束
就是唯一性的约束的意思
就是表明某个列的值必须是唯一的。不能有重复。
唯一性的约束可以通过create table的语句来达到。
唯一性约束有2个表现方式
1 指明是唯一的属性
2 创建主键,也就是说, 主键=唯一性约束

一个表可以有多个唯一性约束,但是只能有一个主关键字
必须将唯一性约束的列都定义为not null,但是唯一性索引却没有这个必要,因为索引本身就不能是null的。

创建唯一性约束
CREATE TABLE turen (
       eID   INT        NOT NULL PRIMARY KEY,
       name    CHAR(30)   ,
       dID  INT        NOT NULL UNIQUE
       )

增加唯一性约束
ALTER TABLE turen  ADD CONSTRAINT turen_pk PRIMARY KEY (empID)


Referential Constraints
参照约束
这种约束主要是约束了表与表之间的数据的一致性和合法性
这种约束主要是用主键,唯一性约束,外键配合使用来达到参照约束的作用。

参照约束实际就是表之间的一对多的模型关系。

我们打个比方
比如一个表是部门表,里面罗列了各个部门的信息
一个表示雇员表,里面是各个雇员的信息
那么
部门表和雇员表之间就必然存在各个关系
比如
一个部门可以用多个雇员,而一个雇员只能属于一个部门,
那么这样的关系我们该如何简单表达呢?
这个时候db2就有了父表,子表,主键,外键的概念。
一般来说,
外键是建立在行数比较多的表上。
主键的特性是不能为空,必须唯一。
外键的特性是要么为空,要么存在主键之中。
在这个例子中,我们在部门表中将部门id设置为主键,将雇员表的部门id设置为外键,那么,他们之间就会存在对应的关系了。
这就是参照约束的典型案例。
参照约束主要是表现在对父表或者子表的数据的插入或者删除的时候所引发的操作。
比如我在往子表中插入雇员信息的时候我们不能插入一个部门不存在的雇员信息
也就是说一个雇员不能为一个在公司里面不存在的部门工作。

我们先看这样的一个创建参照约束的例子:

CREATE TABLE dept (
       dep_ID      INT           NOT NULL PRIMARY KEY,
       dept_Name    VARCHAR(30)   NOT NULL,
       emp_Name  CHAR(15)
       )

CREATE TABLE emp (
       emp_ID         INT           NOT NULL PRIMARY KEY,
      emp_name       VARCHAR(30)   NOT NULL,
       dept_no      INT           REFERENCES country,
       population      INT
       )

在第二个表中
dept_no这里,db2会自动去将第一个表的主键和这个列建立主键和外键的关系。我们无需去指定特定的主键。

我们也可以在表创建好了之后通过这样语句来添加参照约束
ALTER TABLE emp ADD FOREIGN KEY (emp_no) REFERENCES dept (dept_ID)

在对父表的数据的删除上面
主要有4中子表的行为模式我们可以设置
Restrict
Noaction
Set null
Cascade

我们还是刚才的例子来说明这四种模式的特点。

Cascade
如果我们在dept父表上面删除a部,cascade就是将子表中的所有a部门的所在的行删除。
这就是所谓的我们现实社会里面的部门取消,人员解散。

Set null
如果我们在dept父表上面删除a部,set null,就是说子表中所有的a部门的数据行中的部门值被设置为null
这就是所谓的我们现实社会里面的部门取消,人员等待再分配

Restrict和noaction
的特点基本一致
如果我们在dept父表上面删除a部,Restrict就是说只要子表中的a部门下面还有雇员,那么父表的中相应的数据将被限制,无法被删除。
这就是所谓的我们人民解放军的人在阵地在的意思。
如果用户一定要如此删除的话
就需要先去子表中将相应的数据行删除,然后才能在父表中删除数据。


Check constraint
检查约束实际就是对特定的表而言的。
也就是将特定表的特定的列的数据进行数据范围规定和限定
每次我们数据处理的时候
都需要对该列的数据进行检查

这样的约束可以在创建表的时候来创建
比如
CREATE TABLE turen (
       ID     INT           NOT NULL PRIMARY KEY,
       name           VARCHAR(30)   NOT NULL,
       sex            CHAR(1)       NOT NULL
       CONSTRAINT sex_check_const CHECK (sex in ('M ', 'F '))
       )

也可以通过alter table 的方式来添加Check constraint
ALTER TABLE turen
      ADD CONSTRAINT sex_check_const CHECK (sex in ('M ', 'F '))

大家可以看见了
就是对sex_check_const进行限制
性别就是雌或者雄
不能有其他的


Informational constraint
信息约束
在db2v8以前
一旦约束创建了
那么这些约束就是每次都是必须作用。
在db2v8以后
这种情况发生了变化
主要是出来了一些巨无霸的应用软件

Sap
People soft
Siebel
等等
他们这些软件自己就直接在代码里面就直接将各种约束写在了code之中。
所以
如果这个时候db2中,将约束机制停止的话,那么db2的工作效率无疑会有所提高。
这个时候,就是Informational constraint的意义了。

Informational constraint
有四种模式

ENFORCED
就是默认值
每次必用,始终运行

NOT ENFORCED
Db2停止自己的约束的运转和检查

ENABLE QUERY OPTIMIZATION
将约束的因素考虑进优化器的计算

DISABLE QUERY OPTIMIZATION
不计算约束的优化器的因素的计算

创建Informational constraint

CREATE TABLE turen (
       ID     INT           NOT NULL PRIMARY KEY,
       name           VARCHAR(30)   NOT NULL,
       sex            CHAR(1)       NOT NULL
       CONSTRAINT sex_check_const CHECK (sex in ('M ', 'F '))
       NOT ENFORCED
       )


原文链接:  http://www.ituren.org.cn/html/jishusuibi/200809/17-128.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP