王朝网络
分享
 
 
 

Oracle PL/SQL语言初级教程之完整性约束

王朝oracle·作者佚名  2008-05-31
宽屏版  字体: |||超大  

完整性约束

完整性约束用于增强数据的完整性,Oracle提供了5种完整性约束:

Check

NOT NULL

Unique

Primary

Foreign key

完整性约束是一种规则,不占用任何数据库空间。完整性约束存在数据字典中,在执行SQL或PL/SQL期间使用。用户可以指明约束是启用的还是禁用的,当约束启用时,他增强了数据的完整性,否则,则反之,但约束始终存在于数据字典中。

禁用约束,使用ALTER语句

ALTER TABLE table_name DISABLE CONSTRAINT constraint_name;

ALTER TABLE policies DISABLE CONSTRAINT chk_gender

假如要重新启用约束:

ALTER TABLE policies ENABLE CONSTRAINT chk_gender

删除约束

ALTER TABLE table_name DROP CONSTRAINT constraint_name

ALTER TABLE policies DROP CONSTRAINT chk_gender;

Check 约束

在数据列上Check 约束需要 一个非凡的布尔条件或者将数据列设置成TRUE,至少一个数据列的值是NULL,Check约束用于增强表中数据内容的简单的商业规则。用户使用Check约束保证数据规则的一致性。Check约束可以涉及该行同属Check约束的其他数据列但不能涉及其他行或其他表,或调用函数SYSDATE,UID,USER,USERENV。假如用户的商业规则需要这类的数据检查,那么可以使用触发器。Check约束不保护LOB数据类型的数据列和对象、嵌套表、VARRY、ref等。单一数据列可以有多个Check约束保护,一个Check约束可以保护多个数据列。

创建表的Check约束使用CREATE TABLE语句,更改表的约束使用ALTER TABLE语句。

语法:

CONSTRAINT [constraint_name] CHECK (condition);

Check约束可以被创建或增加为一个表约束,当Check约束保护多个数据列时,必须使用表约束语法。约束名是可选的并且假如这个名字不存在,那么oracle将产生一个以SYS_开始的唯一的名字。

例:

CREATE TABLE policies

(policy_id NUMBER,

holder_name VARCHAR2(40),

gender VARCHAR2(1) constraint chk_gender CHECK (gender in ('M','F'),

marital_status VARCHAR2(1),

date_of_birth DATE,

constraint chk_marital CHECK (marital_status in('S','M','D','W'))

);

NOT NULL约束

NOT NULL约束应用在单一的数据列上,并且他保护的数据列必须要有数据值。缺省状况下,ORACLE答应任何列都可以有NULL值。某些商业规则要求某数据列必须要有值,NOT NULL约束将确保该列的所有数据行都有值。

例:

CREATE TABLE policies

(policy_id NUMBER,

holder_name VARCHAR2(40) NOT NULL,

gender VARCHAR2(1),

marital_status VARCHAR2(1),

date_of_birth DATE NOT NULL

);

对于NOT NULL的ALTER TABLE语句与其他约束稍微有点不同。

ALTER TABLE policies MODIFY holder_name NOT NULL

唯一性约束(Unique constraint)

唯一性约束可以保护表中多个数据列,保证在保护的数据列中任何两行的数据都不相同。唯一性约束与表一起创建,在唯一性约束创建后,可以使用ALTER TABLE语句修改。

语法:

column_name data_type CONSTRAINT constraint_name UNIQUE

假如唯一性约束保护多个数据列,那么唯一性约束要作为表约束增加。语法如下:

CONSTRAINT constraint_name (column) UNIQUE USING INDEX TABLESPACE (tablespace_name) STORAGE (stored clause)

唯一性约束由一个B-tree索引增强,所以可以在USING子串中为索引使用非凡特征,比如表空间或存储参数。CREATE TABLE语句在创建唯一性约束的同时也给目标数据列建立了一个唯一的索引。

CREATE TABLE insured_autos

(policy_id NUMBER CONSTRAINT pk_policies PRIMARY KEY,

vin VARCHAR2(10),

coverage_begin DATE,

coverage_term NUMBER,

CONSTRAIN unique_auto UNIQUE (policy_id,vin) USING INDEX TABLESPACE index STORAGE (INITIAL 1M NEXT 10M PCTINCREASE 0)

);

用户可以禁用未以性约束,但他仍然存在,禁用唯一性约束使用ALTER TABLE 语句

ALTER TABLE insured_autos DISABLE CONSTRAIN unique_name;

删除唯一性约束,使用ALTER TABLE....DROP CONSTRAIN语句

ALTER TABLE insured_autos DROP CONSTRAIN unique_name;

注重用户不能删除在有外部键指向的表的唯一性约束。这种情况下用户必须首先禁用或删除外部键(foreign key)。

删除或禁用唯一性约束通常同时删除相关联的唯一索引,因而降低了数据库性能。经常删除或禁用唯一性约束有可能导致丢失索引带来的性能错误。要避免这样错误,可以采取下面的步骤:

1、在唯一性约束保护的数据列上创建非唯一性索引。

2、添加唯一性约束

主键(Primary Key)约束

表有唯一的主键约束。表的主键可以保护一个或多个列,主键约束可与NOT NULL约束共同作用于每一数据列。NOT NULL约束和唯一性约束的组合将保证主键唯一地标识每一行。像唯一性约束一样,主键由B-tree索引增强。

创建主键约束使用CREATE TABLE语句与表一起创建,假如表已经创建了,可以使用ALTER TABLE语句。

CREATE TABLE policies

(policy_id NUMBER CONSTRAINT pk_policies PRIMARY KEY,

holder_name VARCHAR2(40),

gender VARCHAR2(1),

marital_status VARCHAR2(1),

date_of_birth DATE

);

与唯一性约束一样,假如主键约束保护多个数据列,那么必须作为一个表约束创建。

CREATE TABLE insured_autos

(policy_id NUMBER,

vin VARCHAR2(40),

coverage_begin DATE,

coverage_term NUMBER,

CONSTRAINT pk_insured_autos PRIMARY KEY (policy_id,vin)

USING INDEX TABLESPACE index

STORAGE (INITIAL 1M NEXT 10M PCTINCREASE 0)

);

禁用或删除主键必须与ALTER TABLE 语句一起使用

ALTER TABLE policies DROP PRIMARY KEY;

ALTER TABLE policies DISABLE PRIMARY KEY;

外部键约束(Foreign key constraint)

外部键约束保护一个或多个数据列,保证每个数据行的数据包含一个或多个null值,或者在保护的数据列上同时拥有主键约束或唯一性约束。引用(主键或唯一性约束)约束可以保护同一个表,也可以保护不同的表。与主键和唯一性约束不同外部键不会隐式建立一个B-tree索引。在处理外部键时,我们经常使用术语父表(parent table)和子表(child table),父表表示被引用主键或唯一性约束的表,子表表示引用主键和唯一性约束的表。

创建外部键使用CREATE TABLE语句,假如表已经建立了,那么使用ALTER TABLE语句。

CREATE TABLE insured_autos

(policy_id NUMBER CONSTRAINT policy_fk

REFERENCE policies(policy_id

ON DELETE CASCADE,

vin VARCHAR2(40),

coverage_begin DATE,

coverage_term NUMBER,

make VARCHAR2(30),

model VARCHAR(30),

year NUMBER,

CONSTRAIN auto_fk FROEIGN KEY (make,model,year)

REFERENCES automobiles (make,model,year)

ON DELETE SET NULL

);

ON DELETE子串告诉ORACLE假如父纪录(parent record)被删除后,子记录做什么。缺省情况下禁止在子记录还存在的情况下删除父纪录。

外部键和NULL值

在外部键约束保护的数据列中NULL值的处理可能产生不可预料的结果。ORACLE 使用ISO standar Match None规则增强外部键约束。这个规则规定假如任何外部键作用的数据列包含有一个NULL值,那么任何保留该键的数据列在父表中没有匹配值。

比如,在父表AUTOMOBILES中,主键作用于数据列MAKE,MODEL,YEAR上,用户使用的表INSURED_AUTOS有一个外部约束指向AOTOMOBILES,注重在INSURES_AUTOS中有一数据行的MODEL列为NULL值,这一行数据已经通过约束检查,即使MAKE列也没有显示在父表AUTOMOBILES中,如下表:

表1 AUTOMOBILES

MAKE

MODEL

YEAR

Ford

Taurus

2000

Toyota

Camry

1999

表2 INSURED_AUTOS

POLICY_ID

MAKE

MODEL

YEAR

576

Ford

Taurus

2000

577

Toyota

Camry

1999

578

TUCker

NULL

1949

延迟约束检验(Deferred Constraint Checking)

约束检验分两种情况,一种是在每一条语句结束后检验数据是否满足约束条件,这种检验称为立即约束检验(immediately checking),另一种是在事务处理完成之后对数据进行检验称之为延迟约束检验。在缺省情况下Oracle约束检验是立即检验(immediately checking),假如不满足约束将先是一条错误信息,但用户可以通过SET CONSTRAINT语句选择延迟约束检验。语法如下:

SET CONSTRAINT constraint_nameALL DEFEERREDIMMEDIATE --;

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有