复习:
数据库的特性:
共享性
独立性
完整性
减少数据冗余
数据完整性规则通过约束来实现,约束是在表上强制执行的一些数据校验规则,在插入、修改或者删除数据时必须符合在相关字段上设置的这些规则,否则报错。
Oracle使用完整性约束机制以防止无效的数据进入数据库的基表,如果一个DML语句执行结果破坏完整性约束,就会回滚语句并返回一个错误。通过完整性约束实现数据完整性规则有以下优点:
●完整性规则定义在表上,存储在数据字典中,应用程序的任何数据都必须遵守表的完整性约束。
●当定义或修改完整性约束时,不需要额外编程。
●用户可指定完整性约束是启用或禁用。
●当由完整性约束所实施的事务规则改变时,只需改变完整性约束的定义,所有应用自动地遵守所修改的约束。
数据完整性一般包括域完整性、实体完整性、参照完整性,用户定义完整性,下面分别进行介绍。
域完整性指列数据输入的有效性,又称列完整性,通过CHECK约束、DEFALUT约束、NOT NULL约束、数据类型和规则等实现域完整性。
CHECK约束通过显示输入到列中的值来实现域完整性
例如:对于stsys数据库score表,grade规定为0分到100分之间,可用CHECK约束表示。
实体完整性要求表中有一个主键,其值不能为空且能唯一地标识对应的记录,又称为行完整性,通过PRIMARY KEY约束、UNIQUE约束、索引或 IDENTITY 属性等实现数据的实体完整性。
例如,对于stsys数据库中student表,sno列作为主键,每一个学生的sno列能唯一地标识该学生对应的行记录信息,通过sno列建立主键约束实现student表的实体完整性。
实体完整性也就是行完整性,通过设置主键,保证数据唯一且非空
UNIQUE约束保证数据非空
索引:通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
IDENTITY属性:唯一标识一行
参照完整性保证主表中的数据与从表中数据的一致性,又称为引用完整性,参照完整性确保键值在所有表中一致,通过定义主键(PRIMARY KEY)与外键(FOREIGN KEY)之间的对应关系实现参照完整性。
例如,将student表作为主表,表中的sno列作为主键,score表作为从表,表中的sno列作为外键,从而建立主表与从表之间的联系实现参照完整性,student表和score表的对应关系如下图所示。
如果定义了两个表之间的参照完整性,则要求:
从表不能引用不存在的键值。
如果主表中的键值更改了,那么在整个数据库中,对从表中该键值的所有引用要进行一致的更改。
如果要删除主表中的某一记录,应先删除从表中与该记录匹配的相关记录。(删除的时候先删从表的再删主表的,增加的时候先加主表的再加从表的)
总括起来, Oracle数据库中的数据完整性包括域完整性、实体完整性、参照完整性,和实现上述完整性的约束,其中:
CHECK约束,检查约束,实现域完整性。
NOT NULL约束,非空约束,实现域完整性。
PRIMARY KEY约束,主键约束,实现实体完整性。
UNIQUE KEY约束,唯一性约束,实现实体完整性。
FOREIGN KEY约束,外键约束,实现参照完整性。
域完整性通过CHECK约束实现,CHECK约束对输入列或整个表中的值设置检查条件,以限制输入值,保证数据库的数据完整性。下面介绍通过CHECK约束实现域完整性。
【例】使用SQL Developer,在stsys数据库student表的ssex列,创建一个性别为男或女的CHECK约束CK_ssex。
(1)启动”SQL Developer”,在”连接”节点下打开数据库连接”sys_stsys”,展开“表”节点,选中表“student”,单击鼠标右键,在弹出的快捷菜单中选择”约束条件”→“添加检查”命令,出现如图所示的“添加检查”窗口中,在“约束条件名称”栏输入约束名称CK_ssex,在“检查条件”栏输入相应的CHECK约束表达式为ssex in (‘男’, ‘女’)。
【例】使用SQL Developer,修改或删除创建的CHECK约束CK_ssex。
(1)启动”SQL Developer”,在”连接”节点下打开数据库连接”sys_stsys”,展开“表”节点,选中表“student”,单击鼠标右键,在弹出的快捷菜单中选择”编辑”命令,出现“编辑表”窗口,如图所示。
(2)在“编辑表”窗口中,单击“添加”按钮,可以添加一个检查约束;单击“删除”按钮,可以删除一个检查约束;在选择一个检查约束后,可在“名称”栏中修改名称,在“条件”栏修改相应的检查约束表达式。
(3)单击“确定”按钮,完成上述“CHECK约束”的添加、删除或修改。
使用PL/SQL语句在创建表时创建CHECK约束有作为列的约束或作为表的约束两种方式。
语法格式:
CREATE TABLE <表名>
( <列名> <数据类型> [DEFAULT <默认值>] [NOT NULL | NULL]
[CONSTRAINT <CHECK约束名>] CHECK(<CHECK约束表达式>) /*定义为列的约束*/
[,…n]
[CONSTRAINT <CHECK约束名>] CHECK(<CHECK约束表达式>) /*定义为表的约束*/
)
其中,CONSTRAINT关键字为CHECK约束定义名称,CHECK约束表达式为逻辑表达式。
【例1】在stsys数据库中创建表goods2,包含以下域完整性定义
CREATE TABLE goods2
(
gid char(6) NOT NULL PRIMARY KEY, /*商品号*/
gname char(20) NOT NULL, /*商品名*/
gclass char(6) NOT NULL, /*类型*/
price number NOT NULL CHECK(price<=8000), /*价格*/
tradeprice number NOT NULL, /*批发价格*/
stockqt number NOT NULL, /*库存量*/
orderqt number NULL /*订货尚未到货商品数量*/
);
在上述语句中,定义goods2表price列的CHECK约束表达式为CHECK(price<=8000),即价格小于或等于8000。
【例2】在表goods2中,插入记录1005,DELL Inspiron 15R,10,9899,14,7。
INSERT INTO goods2 VALUES('1005','DELL Inspiron 15R','10',9899,6930,14,7);
在goods2表price列,由于插入记录中的价格大于8000,违反CHECK约束,系统报错,拒绝插入。
语法格式:
ALTER TABLE <表名>
ADD( CONSTRAINT <CHECK约束名> CHECK(<CHECK约束表达式>))
【例】通过修改goods2表,增加批发价格列的CHECK约束。
ALTER TABLE goods2
ADD CONSTRAINT CK_tradeprice CHECK(tradeprice<=6000);
语法格式:
ALTER TABLE <表名>
DROP CONSTRAINT <CHECK约束名>
(定义约束的时候最好定义好一个约束的名称,方便删除。之前没定义的话系统会自动定一个,但一般会比较长,还要自己去查看叫什么,不方便)
【例】删除stsc数据库的goods2表批发价格列的CHECK约束。
ALTER TABLE goods2
DROP CONSTRAINT CK_tradeprice;
实体完整性通过PRIMARY KEY约束、UNIQUE约束等实现。
通过PRIMARY KEY约束定义主键,一个表只能有一个PRIMARY KEY约束,且PRIMARY KEY约束不能取空值,Oracle为主键自动创建唯一性索引,实现数据的唯一性。
通过UNIQUE约束定义唯一性约束,为了保证一个表非主键列不输入重复值,应在该列定义UNIQUE约束。
PRIMARY KEY约束与UNIQUE约束主要区别如下:
● 一个表只能创建一个PRIMARY KEY约束,但可创建多个UNIQUE约束。
● PRIMARY KEY约束的列值不允许为NULL,UNIQUE约束的列值可取NULL。(但非空的那些都是不一样的,是唯一的)
● 创建PRIMARY KEY约束时,系统自动创建聚集索引,创建UNIQUE约束时,系统自动创建非聚集索引。
● PRIMARY KEY约束与UNIQUE约束都不允许对应列存在重复值
使用SQL Developer创建和删除PRIMARY KEY约束参看之前文章(创建和使用表)的相关操作步骤。
使用SQL Developer创建与删除UNIQUE约束举例如下:
【例】 使用SQL Developer,在course表的课程名列,创建和删除UNIQUE约束。
(1)启动”SQL Developer”,展开“表”节点,选中表“student”,单击鼠标右键,在弹出的快捷菜单中选择”编辑”命令,出现“编辑表”窗口,单击“唯一约束条件”选项,如图所示。
(2)单击“添加”按钮,在右边的“名称”栏中输入UNIQUE约束的名称,在“可用列”栏选择要添加到UNIQUE约束的列,这里选择tno列,然后单击“>”按钮,将其添加到“所选列”中,如图所示。
(3)单击“确定”按钮,完成创建UNIQUE约束。
如果要删除UNIQUE约束,打开如图9.4所示的“编辑表”窗口“唯一约束条件”选项,选择要删除的UNIQUE约束,单击“删除”按钮,单击“确定”按钮即可。
语法格式:
CREATE TABLE <表名> /*指定表名*/
(<列名> <数据类型> [NULL |NOT NULL] /*定义字段*/
{[CONSTRAINT <约束名>] /*定义约束名*/
PRIMARY KEY | UNIQUE } /*定义约束类型*/
[,…n]
[, [CONSTRAINT <约束名>] {PRIMARY KEY | UNIQUE}(<列名>,[,…n]) ]
/*在所有列定义完毕后定义约束名和约束类型*/
)
说明:
● PRIMARY KEY | UNIQUE:定义约束类型,PRIMARY KEY为主键,UNIQUE为唯一键。
● 可以在某一列后面定义PRIMARY KEY约束和UNIQUE约束,也可以在所有列定义完毕后定义PRIMARY KEY约束和UNIQUE约束,但要提供要定义约束的列或列的组合。
【例】对stsys数据库中goods3表的商品号列创建PRIMARY KEY约束,对商品名称列创建UNIQUE约束。
CREATE TABLE goods3
(
gid char(6) NOT NULL CONSTRAINT PK_gid PRIMARY KEY,
gname char(20) NOT NULL CONSTRAINT UK_gname UNIQUE,
gclass char(6) NOT NULL,
price number NOT NULL CONSTRAINT CK_price CHECK(price<=8000),
tradeprice number NOT NULL,
stockqt number NOT NULL,
orderqt number NULL
);
语法格式:
ALTER TABLE <表名>
ADD([CONSTRAINT <约束名>] {PRIMARY KEY | UNIQUE} (<列名>[,…n])
说明: ADD CONSTRAINT对指定表增加一个约束,约束类型为PRIMARY KEY约束或UNIQUE约束。
【例】在stsys数据库中首先创建goods4表后,通过修改表,对商品号列创建PRIMARY KEY约束,对商品名称列创建UNIQUE约束。
创建goods4表语句如下:
CREATE TABLE goods4
(
gid char(6) NOT NULL,
gname char(20) NOT NULL,
gclass char(6) NOT NULL,
price number NOT NULL,
tradeprice number NOT NULL,
stockqt number NOT NULL,
orderqt number NULL
);
通过修改表,对商品号列创建PRIMARY KEY约束,对商品名称列创建UNIQUE约束的语句如下:
ALTER TABLE goods4
ADD (CONSTRAINT PK_goodsgid PRIMARY KEY (gid)); /*注意,KEY和()之间不要有空格,如果有空格就不要()*/
ALTER TABLE goods4
ADD (CONSTRAINT UK_goodsgname UNIQUE (gname));
语法格式:
ALTER TABLE <表名>
DROP CONSTRAINT <约束名>[,…n];
【例】 删除上例创建的PRIMARY KEY约束、UNIQUE约束。
ALTER TABLE goods4
DROP CONSTRAINT PK_goodsgid;
ALTER TABLE goods4
DROP CONSTRAINT UK_goodsgname;