一、数据完整性的分类
1.域完整性
域完整性又称为列完整性,指定一个数据集对某一个列是否有效和确定是否允许空值。
2.实体完整性
实体完整性也可以称为行完整性,要求表中的每一行有一个唯一的标识符,这个标识符就是主关键字。
3.参照完整性
参照完整性又称引用完整性,他保证主表和从表(被参照表)中数据的一致性。在Oracle中,参照完整性的实现是通过定义外键与主键之间的对应关系实现的。如果在被引用表中的一行被某外键字引用,那么这一行既不能被删除,也不能修改主关键字。
二、域完整性的实现
使用check约束
CHECK约束实际上是字段输入内容的验证规则,表示这个字段的输入内容必须满足CHECK约束的条件;若不满足,则数据无法正常输入。
1、在创建表时创建约束
语法格式:
CREATE TABLE <表名>
( <列名> <数据类型> [DEFAULT <默认值>] [NOT NULL | NULL]
[CONSTRAINT <CHECK约束名>] CHECK(<CHECK约束表达式>) /*定义为列的约束*/
[,…n]
[CONSTRAINT <CHECK约束名>] CHECK(<CHECK约束表达式>) /*定义为表的约束*/
)
CONSTRAINT:为约束字CHECK约束定义一个名称,如果省略则系统自动定义一个名称。
CHECK:定义在某列后,则此约束只适用于该列。
定义在所有列之后,则此约束适用于该表。
【例1】定义KCB2表,同时定义其“学分”列的约束条件。
【例2】 在XSCJ数据库中创建books表,其中包含所有的约束定义。
DEFAULT'New book' :默认值,当插入为空时默认为New book
2、在修改表时创建约束
语法格式:
ALTER TABLE<表名>
ADD(CONSTRAINNT <CHENK约束名> CHECK (<CHECK 约束表达式>))
//在已经定义的表中增加一个约束定义。
【例】通过修改数据库的books表,增加trade_price(批发价)字段的CHECK约束。
3、删除约束
语法格式:
ALTER TABLE <表名>
DROP CONSTRAINT<CHECK 约束名>
【例】删除books表批发价字段的CHECK约束。
三、实体完整性的实现
可以通过索引、UNIQUE约束、PRIMARY KEY约束实现数据的实体完整性。
PRIMARY KEY约束与UNIQUE约束的区别:
1、一个表只能创建一个PRIMARY KEY约束,但可以根据需要对不同得列创建若干个UNIQUE约束。
2.PRIMARY KEY字段的值不允许取NULL,而UNIQUE字段的值可取NULL。
PRIMARY KEY约束与UNIQUE约束的共同点:
两者均不允许表中对应字段存在重复值;在创建PRIMARY KEY约束与UNIQUE约束时会自动产生索引。
1、创建表的同时创建约束
语法格式:
CREATE TABLE <表名> /*指定表名*/
(<列名> <数据类型> [NULL |NOT NULL] /*定义字段*/
{[CONSTRAINT <约束名>] /*定义约束名*/
PRIMARY KEY | UNIQUE} /*定义约束类型*/
[,…n]
[, [CONSTRAINT <约束名>] {PRIMARY KEY | UNIQUE}(<列名>,[,…n]) ]
]
)
【例】对XSCJ数据库中XSB2表的“学号”字段创建PRIMARY KEY约束,对“身份证号码”字段定义UNIQUE约束。
2、通过修改表来建立约束
语法格式:
ALTER TABLE <表名>
ADD([CONSTRAINT <约束名>] {PRIMARY KEY | UNIQUE} (<列名>[,…n])
索引字段可包含一列或多列。
【例】先在XSCJ数据库中创建表XSB3,然后通过修改表,对学号字段创建PRIMARY KEY约束,对身份证号字段创建UNIQUE约束。
3、 删除约束
语法格式:
ALTER TABLE <表名>
DROP CONSTRAINT <约束名>[,…n];
【例】删除XSB3的UN_XS约束。
四、参照完整性的实现
两个相关联的表进行数据插入和删除时,通过参照完整性保证他们之间数据的一致性。利用FOREIGN KEY定义从表的外键,PRIMARY KEY约束定义主表中的主键(不允许为空),可实现主表和从表之间的参照完整性。
对于FOREIGN KEY约束来说,在创建时应该考虑以下因素。
(1)在删除主表之前,必须删除FOREIGN KEY约束。
(2)如果不删除或禁止FOREIGN KEY约束,则不能删除主表。
(3)在删除包含主表的表空间之前,必须先删除FOREIGN KEY约束。
关键字REFERENCES 指明该字段为外键。
ON DELETE CASCADE 表示从主表删除数据时自动删除从表中匹配的行。
ON DELETE SET NULL表示当从主键删除数据时,设置从表中与之对应的外键列为NULL。
1、创建表的同时定义外键约束
语法格式:
CREATE TABLE <从表名>
( <列定义> [ CONSTRAINT <约束名> ] REFERENCES <主表名>[ ( <列名> [ ,...n ] ) ]
[,…n]
[ [ CONSTRAINT <约束名> ] [ FOREIGN KEY ( <列名> [,...n ] ) [<参照表达式>]]
);
其中:
<参照表达式>::=
REFERENCES <主表名>[ ( <列名> [ ,...n ] ) ]
[ ON DELETE { CASCADE | SET NULL } ]
【例1】创建stu表,要求表中所有的学生学号都必须出现在XSB表中。
【例2】创建point表,要求表中所有的学号、课程号组合都必须出现在CJB表中,并且当删除CJB表中的记录时同时删除point表中与主键对应的记录。
2、通过修改表定义外键约束
语法格式:
ALTER TABLE <表名>
ADD CONSTRAINT <约束名>
FOREIGN KEY( <列名>[,…n])
REFERENCES <主表名>(<列名>[,…n]) <参照表达式>
【例】假设数据库中KCB表为主表,KCB的“课程号”字段已定义为主键。CJB表为从表,如下示例用于将CJB的“课程号”字段定义为外键。
3、删除表间的参照关系
【例】 删除以上对“CJB.课程号”字段定义的FK_KC外键约束。