Oracle数据完整性和约束性

数据库不仅仅是存储数据,它还必须保证所有存储数据的正确性,因为只有正确的数据才能提供有价值的信息。如果数据不准确或不一致,那么该数据的完整性就可能受到破坏,从而给数据库本身的可靠性带来问题。为了维护数据库中数据的完整性,在创建表时常常需要定义一些约束。约束可以限制列的取值范围,强制列的取值来自合理的范围。在Oracle 11g系统中,约束的类型包括非空约束、主键约束、唯一约束、外键约束、检查约束和默认约束。

创建BOOKS(图书)表,用于实例的操作使用。

CREATE TABLE BOOKS
(
  BOOKNO NUMBER(4) NOT NULL,           --图书编号
  BOOKNAME VARCHAR2(20),               --图书名称
  AUTHOR VARCHAR2(10),                 --作者   
  SALEPRICE NUMBER(9,2),               --定价     
  PUBLISHERNO VARCHAR2(4) NOT NULL,    --出版社编号
  PUBLISHDATE DATE,                    --出版日期
  ISBN VARCHAR2(20) NOT NULL          --ISBN
);

1、非空约束

非空约约束就是限制必须为某个列提供值。空值(NULL)是不存在值,它既不是数字0,也不是空字符串,而是不存在、未知的情况。

【实例】为BOOKS(图书)表中的BOOKNAME字段设置非空约束。

ALTER TABLE BOOKS MODIFY BOOKNAME NOT NULL;

【实例】删除BOOKS(图书)表中关于BOOKNAME列的非空约束。

ALTER TABLE BOOKS MODIFY BOOKNAME NULL;

2、主键约束

主键约束用于唯一地标识表中的每一行记录。在一个表中,最多只能有一个主键约束,主键约束既可以由一个列组成,也可以由两个或两个以上的列组成(这种称为联合主键)。对于表中的每一行数据,主键约束列都是不同的,主键约束同时也具有非空约束的特性。

如果主键约束由一列组成时,该主键约束被称为行级约束。如果主键约束由两个或两个以上的列组成时,则该主键约束被称为表级约束。若要设置某个或某些列为主键约束,通常使用CONSTRAINT…PRIMARY KEY语句来定义。

【实例】使用ALTER TABLE…ADD语句为BOOKS(图书)表增加主键约束。

ALTER TABLE BOOKS ADD CONSTRAINT BOOKS_PK PRIMARY KEY(BOOKNO);

--或者
ALTER TABLE BOOKS ADD PRIMARY KEY(BOOKNO);

说明:如果构建主键约束的列有多个(即创建表级约束),则多个列之间使用英文输入法下的逗号分隔。

3、唯一性约束

唯一性(UNIQUE)约束强调所在的列不允许有相同的值。但是,它的定义要比主键约束弱,即它所在的列允许空值(但主键约束列是不允许为空值的)。唯一性约束的主要作用是在保证除主键列外,其它列值的唯一性。

在一个表中,根据实际情况可能有多个列的数据都不允许存在相同值。例如,各种“会员表”的QQ、Email等列的值是不允许重复的(但用户可能不提供,这样就必须允许为空值),但是由于在一个表中最多只能由一个主键约束存在,那么如何解决这种多个列都不允许重复数据存在的问题呢?这就是唯一性约束的作用。若要设置某个列为UNIQUE约束,通常使用CONSTRAINT…UNIQUE标记该列。

【实例】为BOOKS(图书)表的ISBN列添加唯一约束。

ALTER TABLE BOOKS ADD CONSTRAINT ISBN_UK UNIQUE(ISBN);

说明:如果要为现有表的多个列同时添加UNIQUE约束,则在括号内使用逗号分隔多个列。

【实例】删除BOOKS(图书)表的ISBN列的唯一约束。

ALTER TABLE BOOKS DROP CONSTRAINT ISBN_UK;

4、外键约束

外键约束比较复杂,一般的外键约束会使用两个表进行关联(当然也存在同一个表自连接的情况)。外键是指“当前表”(即外键表)引用“另外一个表”(即被引用表)的某个列或某几个列,而“另外一个表”中被引用的列必须具有主键约束或者唯一性约束。在“另外一个表”中,被引用列中不存在的数据不能出现在“当前表”对应的列中。一般情况下,当删除被引用表中的数据时,该数据也不能出现在外键表的外键列中。如果外键列存储了被引用表中将要被删除的数据,那么对被引用表的删除操作将失败。

最典型的外键约束时HR模式中的EMPLOYEES和DEPARTMENT表,在该外键约束中,外键表EMPLOYEES中的外键列DEPARTMENT_ID将引用被引用表DEPARTMENTS中的DEMPARTMENT_ID列,而该列也是DEPARTMENTS表的主键。

【实例】在HR模式中,创建一个新表EMPLOYEES_TEMP(该表的结构复制自EMPLOYEES),并为其添加一个与DEPARTMENTS表关联的外键约束。

CREATE TABLE EMPLOYEES_TEMP
AS SELECT * FROM EMPLOYEES
WHERE DEPARTMENT_ID=30;

ALTER TABLE EMPLOYEES_TEMP
ADD CONSTRAINT TEMP_DEPARTID_FK
FOREIGN KEY(DEPARTMENT_ID)
REFERENCES DEPARTMENTS(DEPARTMENT_ID);

5、检查约束

检查约束用来指定某列的可取值的范围,它通过限制输入到列中的值来强制域的完整性。

【实例】为BOOKS(图书)表的SALEPRICE字段添加检查约束,定价必须大于0且小于1200。

ALTER TABLE BOOKS ADD CONSTRAINT SALEPRICE_CK CHECK(SALEPRICE>0 AND SALEPRICE<1200);

6、默认约束

【实例】为BOOKS(图书)表的PUBLISHERNO列添加默认约束。

ALTER TABLE BOOKS MODIFY PUBLISHERNO DEFAULT '1001';

7、删除约束

如果不再需要某个约束时,则可以将其删除。可以使用带DROP CONSTRAINT子句的ALTER TABLE语句删除约束。删除约束与禁用约束不同,禁用的约束时可以激活的,但是删除的约束在表中就完全消失了。使用ALTER TABLE语句删除约束的语法格式如下:

ALTER TABLE TABLE_NAME DROP CONSTRAINTCON_NAME;

TABLE_NAME:表示要删除约束的表名称。

CON_NAME:表示要删除的约束名称。

【实例】删除BOOKS(图书)表的SALEPRICE字段的检查约束。

ALTER TABLE BOOKS DROP CONSTRAINT SALEPRICE_CK;

8、创建数据表同时创建约束

【实例】创建STUDENT_INFO(学生信息)表同时创建约束。

--创建“学生信息”数据表
CREATE TABLE STUDENT_INFO
(
  STU_ID INT PRIMARY KEY,                             --学号,并设置主键约束
  STU_NAME VARCHAR2(8) NOT NULL,                      --姓名,并设置非空约束
  EMAIL VARCHAR2(20) CONSTRAINT EMAIL_UK UNIQUE,      --邮箱,并设置唯一性约束
  SEX CHAR(2) DEFAULT '女',                           --性别,并设置默认约束
  AGE INT CONSTRAINT AGE_CK CHECK(AGE>0 AND AGE<120)  --年龄,并设置检查约束
);

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pan_junbiao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值