ORACLE学习之路--管理数据完整性约束
2010-01-10 17:45
169 查看
通常在我们在做项目开发的时候,不可避免的要遇到保证数据完整性的问题,对于数据完整性我们通常有三种手段: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(外键约束)
外键约束可以理解为通过外部条件来约束表中数据,当然外键也具有反作用。
未完待续... ...
一、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(外键约束)
外键约束可以理解为通过外部条件来约束表中数据,当然外键也具有反作用。
未完待续... ...
相关文章推荐
- Oracle学习(9):创建和管理表
- Oracle学习记录整理笔记2-用户管理
- Oracle 学习笔记2 —— 用户管理
- oracle学习之路(二、存储过程)
- Linux学习之路--日志管理【17】---20180113
- Linux(RedHat)学习之路6.0之逻辑卷管理
- Oracle学习(十五)之用户配置文件及用户管理
- 全面学习ORACLE Scheduler特性(4)创建和管理Schedule
- 微软企业库5.0 学习之路——第八步、使用Configuration Setting模块等多种方式分类管理企业库配置信息
- oracle 11g 学习笔记 10_31_管理表空间和数据文件
- ORACLE EBS架构与管理基础(12.1.3)学习总结
- cabbage liunx学习之路之用户与用户组管理篇
- Oracle学习(四)之用户、权限、角色管理
- Oracle的学习二:表管理(数据类型、创建/修改表、添加/修改/删除数据、数据查询)
- oracle学习之路(二)------数组类型/记录类型的使用
- oracle学习之路(四) ---------PL/SQL 表,二维数组(TABLE)
- Oracle学习之路-- 案例分析实现行列转换的几种方式
- Oracle的学习之路一(概念)
- Oracle的学习之路一(概念)
- Oracle 11g 学习八:视图、用户管理、数据的导入导出和数据表的冷备份