Oracle数据库学习笔记——数据完整性(上)

复习:
数据库的特性:
共享性
独立性
完整性
减少数据冗余

数据完整性概述

数据完整性规则通过约束来实现,约束是在表上强制执行的一些数据校验规则,在插入、修改或者删除数据时必须符合在相关字段上设置的这些规则,否则报错。

Oracle使用完整性约束机制以防止无效的数据进入数据库的基表,如果一个DML语句执行结果破坏完整性约束,就会回滚语句并返回一个错误。通过完整性约束实现数据完整性规则有以下优点:
●完整性规则定义在表上,存储在数据字典中,应用程序的任何数据都必须遵守表的完整性约束。
●当定义或修改完整性约束时,不需要额外编程。
●用户可指定完整性约束是启用或禁用。
●当由完整性约束所实施的事务规则改变时,只需改变完整性约束的定义,所有应用自动地遵守所修改的约束。

数据完整性一般包括域完整性、实体完整性参照完整性用户定义完整性,下面分别进行介绍。

1.域完整性

域完整性指列数据输入的有效性,又称列完整性,通过CHECK约束、DEFALUT约束、NOT NULL约束、数据类型和规则等实现域完整性。

CHECK约束通过显示输入到列中的值来实现域完整性
例如:对于stsys数据库score表,grade规定为0分到100分之间,可用CHECK约束表示。

2.实体完整性

实体完整性要求表中有一个主键,其值不能为空且能唯一地标识对应的记录,又称为行完整性,通过PRIMARY KEY约束、UNIQUE约束、索引IDENTITY 属性等实现数据的实体完整性。

例如,对于stsys数据库中student表,sno列作为主键,每一个学生的sno列能唯一地标识该学生对应的行记录信息,通过sno列建立主键约束实现student表的实体完整性。

实体完整性也就是行完整性,通过设置主键,保证数据唯一且非空
UNIQUE约束保证数据非空
索引:通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
IDENTITY属性:唯一标识一行

3.参照完整性

参照完整性保证主表中的数据与从表中数据的一致性,又称为引用完整性,参照完整性确保键值在所有表中一致,通过定义主键(PRIMARY KEY)与外键(FOREIGN KEY)之间的对应关系实现参照完整性。

  • 主键(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 实现域完整性

1.使用SQL Developer创建CHECK约束

【例】使用SQL Developer,在stsys数据库student表的ssex列,创建一个性别为男或女的CHECK约束CK_ssex。

(1)启动”SQL Developer”,在”连接”节点下打开数据库连接”sys_stsys”,展开“表”节点,选中表“student”,单击鼠标右键,在弹出的快捷菜单中选择”约束条件”→“添加检查”命令,出现如图所示的“添加检查”窗口中,在“约束条件名称”栏输入约束名称CK_ssex,在“检查条件”栏输入相应的CHECK约束表达式为ssex in (‘男’, ‘女’)。

在这里插入图片描述
(2)单击“应用”按钮,完成“CHECK约束”的创建。

2.使用SQL Developer修改或删除CHECK约束

【例】使用SQL Developer,修改或删除创建的CHECK约束CK_ssex。

(1)启动”SQL Developer”,在”连接”节点下打开数据库连接”sys_stsys”,展开“表”节点,选中表“student”,单击鼠标右键,在弹出的快捷菜单中选择”编辑”命令,出现“编辑表”窗口,如图所示。

(2)在“编辑表”窗口中,单击“添加”按钮,可以添加一个检查约束;单击“删除”按钮,可以删除一个检查约束;在选择一个检查约束后,可在“名称”栏中修改名称,在“条件”栏修改相应的检查约束表达式。

(3)单击“确定”按钮,完成上述“CHECK约束”的添加、删除或修改。

在这里插入图片描述

使用PL/SQL语句实现域完整性

1.使用PL/SQL语句在创建表时创建CHECK约束—CONSTRAINT

使用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约束,系统报错,拒绝插入。

2.使用PL/SQL语句在修改表时创建CHECK约束

语法格式:

ALTER TABLE <表名>
  ADD( CONSTRAINT <CHECK约束名> CHECK(<CHECK约束表达式>))

【例】通过修改goods2表,增加批发价格列的CHECK约束。

ALTER TABLE goods2 
  ADD CONSTRAINT CK_tradeprice CHECK(tradeprice<=6000);

3.使用PL/SQL语句删除CHECK约束

语法格式:

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 实现实体完整性

1.使用SQL Developer创建和删除PRIMARY KEY约束

使用SQL Developer创建和删除PRIMARY KEY约束参看之前文章(创建和使用表)的相关操作步骤。

2.使用SQL Developer创建和删除UNIQUE约束

使用SQL Developer创建与删除UNIQUE约束举例如下:

【例】 使用SQL Developer,在course表的课程名列,创建和删除UNIQUE约束。

(1)启动”SQL Developer”,展开“表”节点,选中表“student”,单击鼠标右键,在弹出的快捷菜单中选择”编辑”命令,出现“编辑表”窗口,单击“唯一约束条件”选项,如图所示。
在这里插入图片描述
(2)单击“添加”按钮,在右边的“名称”栏中输入UNIQUE约束的名称,在“可用列”栏选择要添加到UNIQUE约束的列,这里选择tno列,然后单击“>”按钮,将其添加到“所选列”中,如图所示。
在这里插入图片描述
(3)单击“确定”按钮,完成创建UNIQUE约束。

如果要删除UNIQUE约束,打开如图9.4所示的“编辑表”窗口“唯一约束条件”选项,选择要删除的UNIQUE约束,单击“删除”按钮,单击“确定”按钮即可。

使用PL/SQL语句实现实体完整性

1.使用PL/SQL语句在创建表时创建PRIMARY KEY约束、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
);

2.使用PL/SQL语句在修改表时创建PRIMARY KEY约束或UNIQUE约束

语法格式:

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));

3.使用PL/SQL语句删除PRIMARY KEY约束、UNIQUE约束

语法格式:

ALTER TABLE <表名>
      DROP CONSTRAINT <约束名>[,…n];

【例】 删除上例创建的PRIMARY KEY约束、UNIQUE约束。

ALTER TABLE goods4
  DROP CONSTRAINT PK_goodsgid;
ALTER TABLE goods4
  DROP CONSTRAINT UK_goodsgname;

猜你喜欢

转载自blog.csdn.net/weixin_45550460/article/details/105191130