ORACLE学习之路--管理数据完整性约束

来源:互联网 发布:斗鱼小杰 程序员 编辑:程序博客网 时间:2024/06/02 06:49

通常在我们在做项目开发的时候,不可避免的要遇到保证数据完整性的问题,对于数据完整性我们通常有三种手段:CODE、TRIGGER和CONSTRAINTS。有关通过项目代码和触发器来实现数据完整性的维护问题,今天就不做讨论。下面我们来看看在ORACLE中如何使用CONSTRAINTS来实现数据完整性的约束。

 

一、CONSTRAINTS的基本约束类型

     NOT NULL 非空,UNIQUE  唯一,PRIMARY KEY 主键,FOREIGN KEY  外键和CHECK数据检查。

 

     1、NOT NULL(非空)

          通过名字可以很清楚的了解NOT NULL的约束即所约束的列不允许插入NULL值,通常用来约束表中的查询字段,在没有定义的列默认是NULL即可以插入空值。同时它也是唯一可以用在XMLTYPE和变长数组列的约束。

          如:CREATE TABLE EMPLOYEE (EMP_ID NUMBER NOT NULL,

                                                         EMP_NAME VARCHAR2(20))

 

     2、CHECK(检查)

          就是根据表创建时指定的条件对数据进行检查返回TRUE或FALSE。CHECK可分为表级约束和列级约束,如果只是检查某一列的值可以在创建时写在该列的后面,如果要检查多列则需要在定义了全部列后再做定义。在指定CHECK条件的时候可以使用部分ORACLE的函数。如:

          单列:

     CREATE TABLE EMPLOYEE (EMP_ID NUMBER NOT NULL,

                                              EMP_NAME VARCHAR2(4) CONSTRAINT check_empname CHECK(LENGTH(EMP_NAME) <= 4);

 

         多列:

     CREATE TABLE EMPLOYEE (EMP_ID NUMBER NOT NULL,

 

 

                                              EMP_NAME VARCHAR2(4) ,

                                              SALARY NUMBER,

                                              SALARY_ASIG NUMBER

                                              CONSTRAINT check_salary CHECK(SALARY > SALARY));

     第一段代码是保证输入的姓名长度为4个字,第二段是保证输入的销售额必须大于销售任务。

 

      3、UNIQUE(唯一性约束)

           即约束了该列的值不能够有重复值,不过允许多行NULL,因为NULL在ORACLE的定义为不确定。在我们为某行定义唯一约束的时候,如果该行本身已定义了INDEX,则唯一约束则使用该INDEX所为UNIQUE INDEX来做数据的唯一判断,如果该列还没有INDEX,则系统会自动创建一个隐式的INDEX,这个INDEX在动态视图里是可以查询到的,不过却无法删除,它只会伴随UNIQUE约束的删除而被删除。因为UNIQUE约束要创建INDEX就涉及到空间分配问题,这个定义可以在创建的时候指定,如果没有指定,则根据表所在的TABLESPACE定义来定义。如:

           CREATE TABLE EMPLOYEE (EMP_ID NUMBER CONSTRAINT emp_id_u  UNIQUE,

                                                    EMP_NAME VARCHAR2(4))

          上面的SQL语句在EMPLOYEE表的EMP_ID字段上定义了一个唯一性约束。这时系统会为EMP_ID这一列自动添加INDEX,存储结构使用的是该表空间定义的结构。

           CREATE TABLE employee( emp_id         NUMBER(6),
                                                   emp_name   varchar2(2),
                                                   CONSTRAINT emp_id_u UNIQUE (emp_id)
                                                   USING INDEX PCTFREE 20
                                                   TABLESPACE stocks
                                                   STORAGE (INITIAL 8K  NEXT 6K) );  

           上面的SQL 在定义UNIQUE的时候同时指定了PCTFREE,TABLESPACE和STORAGE

 

     4、PRIMARY KEY(主键约束)

          主键约束是我们经常能用到一种约束,也是在使用SSH架构开发项目时要求必须要加的约束。PRIMARY KEY = UNIQUE + NOT NULL,从上面的公式大家可以很形象的了解主键约束,它是即是唯一性约束同时又限制不能有NULL的出现,其自动生成的INDEX遵循和UNIQUE相同的规则,它和UNIQUE不同的是一张表只能有一个主键约束,但可以和UNIQUE一样由多列组成,特别的是有些类型的列是不能作为主键的,如:LOB、LONG、TIMESTAMP WITH TIME(但却可以包含TIMESTAMP WITH LOCAL TIME ZONE)等。多列组成的主键其列数不能超过32列。代码如:

          CREATE TABLE employee (emp_id number CONSTRAINT pk_employee_id PRIMARY KEY,emp_name varchar2(4));或

          CREATE TABLE employee (emp_id number,emp_name varchar2(4),CONSTRAINT pk_emp_id_name PRIMARY KEY(emp_id,emp_name));

 

    5、FOREIGN KEY(外键约束)

         外键约束可以理解为通过外部条件来约束表中数据,当然外键也具有反作用。

 

未完待续... ...