oracle中约束

来源:互联网 发布:js deepCopy 编辑:程序博客网 时间:2024/04/29 01:38

一、维护数据的完整性

概述:数据的完整性用于确保数据库数据遵从一定的商业和逻辑规则。在Oracle中,数据完整性可以使用约束、触发器、应用程序(过程、函数)三种方法来实现,在这三种方法中,因为约束易于维护,并且具有最好的性能,所以作为维护数据完整性的首选。

1、约束

约束用于确保数据库数据满足特定的商业规则。在Oracle中,约束包括:not null、unique、primary key, foreign key和check五种。

A、not null(非空)

如果在列上定义了not null,那么当插入数据时,必须为列提供数据。

B、unique(唯一)

当定义了唯一约束后,该列值是不能重复的,但是可以为null。

C、primary key(主键)

用于唯一的标识表行的数据,当定义主键约束后,该列不但不能重复而且不能为NULL。一张表最多只能有一个主键,但是可以由多个unique约束。

D、foreign key(外键)

用于定义主表和从表之间的关系,外键约束要定义在从表上,主要则必须具有主键约束或是unique约束,当定义外键约束后,要求外键列数据必须在主表的主键列存在或是为NULL。

E、check

用于强制行数据必须满足的条件,假定在sal列上定义了check约束,并要求sal列值在1000~2000之间,如果不在1000~2000之间就会提示出错。

综合案例:

商品售货系统表设计案例

现在有一个商店的数据库,记录客户及其购物情况,由下面三个表组成:

商品表Goods(商品号GoodsId,商品名GoodName,单价UnitPrice,商品类别Categroy,供应商Provider)

客户表Customers(客户号CustomerId,姓名Name,住址Address,电邮Email,性别Gender,身份证CardId)

销售表Purchases(客户号CustomerId,商品号GoodsId,购买数量Num)

请用SQL语言完成下列功能:

建表,在定义中要求声明:

(1)每个表的主外键。

(2)客户的姓名不能为空值。

(3)单价必须大于0,购买数量必须在1~30之间。

(4)电邮不能够重复。

(5)客户的性别必须是男或女,默认是男。

sql>create table Goods(

GoodsId char(8) primary key ,--主键

GoodName varchar2(50),

UnitPrice number(10,2) check(UnitPrice>0),--单价必须大于0

Category varchar(30),

Provider varchar(100));

sql>create table Customers(

CustomerId char(8) primary key,

Name varchar2(30) not null, --姓名不能为空

Address varchar2(150),

Email varchar2(100) unique,--必须唯一

Gender char(2) default('男') check(Gender in('男','女')),

CardId char(18));

sql>create table Purchases(

CustomerId char(8) references Customers(CustomerId), --外键

GoodsId char(8) references Goods(GoodsId),

Num number(10) check(Num between 1 and 30)));

2、添加约束

如果在建表时忘记建立必要的约束,则可以在建表后使用alter table命令为表增加约束,但是要注意:增加not null约束时,需要使用modify选项,而增加其他四种约束使用add选项。

(1)增加商品名也不能为空

sql>alter table Goods modify GoodsId not null;

(2)增加身份证也不能重复

sql>alter table Customers add constraint UQ_CardId unique(CardId);

(3)增加客户的住址只能是海淀、朝阳、东城、西域

sql>alter table Customers add constraint CK_Address check(Address in ('海淀','朝阳','东城','西域'));

3、删除约束

当不再需要某个约束时,可以删除。

sql>alter table 表名 drop constraint 约束名称;

特别说明:

在删除主键约束的时候,可能有错误。比如

sql> alter table 表名 drop primary key;

这是因为如果在两表存在主从关系,那么在删除主表主键约束时,必须带上cascade选项。

sql> alter table 表名 drop primary key cascade;

4、显示约束信息

A、显示约束信息

通过查询数据字典视图user_constraints,可以显示当前用户所有的约束的信息。

sql>select constraint_name,constraint_type,status,validated from user_constraints where table_name='Goods';

B、显示列约束

通过查询数据字典视图user_cons_column,可以显示约束所对应的表列信息。

sql>select column_name,position from user_cons_columns where constraint_name='CK_Address';

6、表级定义和列级定义

A、表级定义

表级定义是指在定义了所有列后,再定义约束,这里需要注意,not null约束只能在列级上定义。

案例:

sql> create table Goods(

GoodsId char(8),GoodsName varchar2(50), Category varchar(30),

constraint PK_GoodsId primary key(GoodsId));

B、列级定义

列级定义是在定义列的同时定义约束。

案例:

sql>create table Goods(

GoodsId char(8) constraint PK_GoodsId primary key ,--主键

GoodName varchar2(50),

UnitPrice number(10,2) check(UnitPrice>0),--单价必须大于0

Category varchar(30),

Provider varchar(100));

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 3岁宝宝喜欢含饭怎么办 孩子咳嗽发烧怎么办最有效 孩子咳嗽打哈切流鼻涕发烧怎么办 孩子香蕉吃多了怎么办 80多岁老人发烧怎么办 小孩香蕉吃多了怎么办 7个月宝宝缺钙怎么办 宝宝脖子被汗淹到红了脱皮怎么办? 小儿出汗多咳嗽怎么办吃什么 牛高烧不退怎么办最好 猪体温低不吃食怎么办 小孩发烧咳嗽怎么办吃什么药 大晚上发烧39度怎么办 胃受凉了老打嗝怎么办 大人发低烧怎么办如何退烧 吃了退热药不退热怎么办 猪持续高烧不退怎么办 猪感冒了不吃食怎么办 6岁儿童发烧38度怎么办 5岁儿童发烧38度怎么办 7岁儿童发烧38度怎么办 儿童发烧到38度怎么办 4岁儿童发烧38度怎么办 9岁儿童发烧38度怎么办 5儿童发烧38度怎么办 咳嗽了20多天怎么办 嘴角烂了怎么办涂什么药 感冒发烧到39度怎么办 6岁宝宝发烧头痛怎么办 生完孩子耻骨疼怎么办 顺产底下外阴红肿伤口流脓怎么办 产后便秘怎么办什么方法最有效 一周岁宝宝拉肚怎么办 三岁宝宝拉水怎么办 喝了过期的青汁怎么办 吃了黑心的苹果怎么办 新生儿两天没拉大便怎么办 贝亲奶瓶不漏怎么办 满月婴儿吃多了怎么办 婴儿吃撑了哭闹怎么办 新生儿吃撑了怎么办啊