创建主键,外键和约束

 

关系数据库的数据必须遵循的约束

实体完整性:所有主属性均不可取空值,不仅仅是主码不可为空

参照完整性:外键或者是空值或者必须作为引用表的主键值而存在。

用户自定义完整性

一个表只能有一个主键!!!多于一个可写成下面的形式:

Create Table SC( --选课表

   S#  Varchar2(10)

   C# Varchar2(20),

   Score Number(3) ,

   Constraint pk Primary Key(S#,C#))

检查约束:自定义某些列上的约束

Constraint s1 Check (age>15)
Constraint s2 Check (Sex In (
M,F
))
Constraint s3 Check (Score>=0 and Score<=100)
Constraint s4 Check (Sname Is Not NULL) = NOT NULL

在子表(设置了外键的表)中插入记录时,若主表(其主属性被另一表引用为外键的表)中对应的列值不存在,则插入出错删除主表中的记录时,若有子表中的相应记录存在,也出错。--若设置了级联删除则不会出错

级联删除:删除主表(即设置了外键的表)中的记录时,同时删除子表中相关联的记录:

Constraint SC Foreign Key(S#) References Student(S#) On Delete Cascade

级联设空:删除主表中的记录时,同时将子表中相应记录的外键列值设为空:On Delete Set NULL

1实体完整性和主码

    SQL中实体完整性是通过主码来实现的。一旦某个属性或属性组被定义为主码,该主码的每个属性就不能为空值,并且在关系中不能出现主码值完全相同的两个元组。

    主码的定义方法有两种:a) 在属性定义后加上关键字 Primary Keyb) 在属性表定义后加上额外的定义主码的子句:Primary Key<主码属性名表>

    说明:1.如果主码仅由一个属性组成,上述两种方法都可定义,若由两个或以上的属性组成,则只能用上述第二种方法定义了。2.对于候选码的说明方法,可以用Unique说明该属性的值不能重复出现。Unique的使用与Primary Key相似。3.一个表中只能有一个主码定义,但可以有多个Unique说明。

2 参照完整性约束与外部码

    参照完整性是对关系间引用数据的一种限制。即:若属性组A是基本关系R1的外码,它与基本关系R2的主码K相对应,则R1中每个元组在A上的值必须:要么取空值,要么等于R2中某元组的主码值。

    SQL中就是利用外部码的说明来实现参照完整性约束,限制表中某些属性的取值的。外部码的说明也有两种方法:1、在该属性的说明后直接加上关键字”REFERENCES <表名><属性名>)”,其中表名称为参照关系名,属性名称为参照关系的主码。2、在Create Table 语句的属性清单后,加上外部码说明子句,格式为:FOREIGN KEY <属性名表1> REFERENCES <表名>(<属性名表2>) 上式中的属性名表1和属性名表2中属性可以多于一个,但必须前后对应。

    前面讲了,外部码的取值只有两种情况:要么取空,要么取参照关系中的主码值。可是当用户操作违反了这个规则时,如何保持此约束呢?SQL提供了三种可选方案:1RESTRICT(限制策略):当用户对表进行违反了上述完整性约束、条件的插入、删除或修改操作时,将会被系统拒绝。2CASCADE(级联策略):当删除或修改参照关系中某元组的主码值时,被参照关系中,那些外部码具有该值的元组也将被删除或修改,以保证参照完整性。3SET NULL(置空策略):置空策略也是针对参照关系的删除或修改操作的。在这种策略下,当删除参照关系中的某一元组或修改某一元组的主码值时,被参照关系中外码值等于该主码值的元组将被置空.

    说明:当用户不指定参照完整性的实现策略时,一般被默认为RESTRICT(限制策略)。实现策略的说明通常被加在外部码的说明后面,格式为:ON DELETE SET NULL ON UPDATE CASCADE

3 用户自定义完整性约束

SQL提供了非空约束、对属性的CHECK约束、对元组的CHECK约束、触发器等来实现用户的各种完整性要求:1、非空约束:在CRETE TABLE 中的属性定义后面加上NOT NULL关键字即定义了该属性不能取空值。2、基于属性的CHECK约束:使用CHECK(检查)子句可保证属性值满足某些前提条件。其一般格式为:CHECK<条件>)如:CHECKage>=18 AND age<=65;   CHECKsex IN (“男”,”女”); CHECKdno IN(select dno from department); 从上例中可以看出,CHECK子句的条件中还可以带子查询。3、基于元组的CHECK约束往往要涉及到表中的多个域。基于元组CHECK约束的说明方法是在CREATE TABLE语句中的属性表、主码、外部码的说明之后加上CHECK子句。

4 约束的更新

为了改和删约束,需要在定义约束时对其进行命名,在各种约束的说明前加上关键字CONSTRAINT 和该约束的名称即可。

例如:在employee表的create table语句中:

eno char(4) CONSTRAINT PK_employee PRIMARY KEY,

dno char(4)CONSTRAINT FK_employee FOREIGN KEY REFERENCES department(dno);

当对各种约束进行命名后,就可以用ALTER TABLE语句来更新与属性或表有关的各种约束。如:

ALTER TABLE employee DROP CONSTRAINT FK_employee;

ALER TABLE Salary ADD CONSTRAINT RightSalary CHECK(Insure+Fund<Rest);

上述的增加约束,实际上也是通过ALTER TABLE语句定义约束的一种形式。

SQL不能直接修改约束,修改某一个约束实际上是用ALTER TABLE 语句先删除该约束,然后再增加一个与该约束同名的新约束。

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值