Oracle约束问题总结(二)

2014-11-24 15:58:22 · 作者: · 浏览: 4
2.CHECK约束,无法使用子查询来计算值是否被允许,也无法使用诸如SYSDATE函数;
3.UNIQUE约束,可以对单列或者多列定义,对于多列时,不需要这些列数据类型相同,也 不需要相邻;
4.PRIMARY KEY约束,可以对单列或者多列定义,它相当于UNIQUE和NOT NULL的组合,但是每个表中只能有一个PK约束,但是可以有任意数量的UNIQUE和NOT NULL的约束列;
5.对于FOREIGN KEY约束,这个约束在子表中定义的列(或者多列)对应父表中的主键列。这些列不需要同名,但数据类型必须相同。什么样的表可以作为父表?这个要具有UNIQUE或者是PRIMARY KEY约束的表。FOREIGN KEY约束还有个特点,就是可以插入NULL值,即使在父表中没有NULL值的情况下。
6.对于开始的问题,一张表中可以有几个不同的约束,这个可以分为两种情况,第一,在表中不同列的约束,如果在不同列有两个PRIMARY KEY是不允许的,其它情况都是可以的,比如可以一列是PK,一列是UNIQUE。第二,在表中同一列中,如果同一列同时有PRIMARY KEY和UNIQUE是不允许的,其它情况都是可以的,比如这一列既是UNIQUE又是FOREIGN KEY。
7.对于创建约束时自动创建索引问题补充
这个是对上次写的补充,(主键约束自动建立索引问题)
在上面所说的五种约束中,只有PK和UNIQUE约束在创建时,产生唯一性索引,
SQL> create table  dept(deptno  number(2,0)   constraint   dept_deptno_pk  primary  key);
SQL> select index_name  from  user_indexes;
INDEX_NAME
------------------------------
DEPT_DEPTNO_PK
JHIST_EMP_ID_ST_DATE_PK
JHIST_JOB_IX

可以看到产生了索引;
在dept表deptno列上创建索引,会产生错误,是因为在建立PRIMARY KEY约束时已经创建了索引;
SQL> create index  tt  on  dept(deptno);
create index  tt  on  dept(deptno)
                           *
ERROR at line 1:
ORA-01408: such column list already indexed

把两个列作为主键,

SQL> create  table dept(deptno   number(2,0),dname varchar2(12),constraint deptno_dname_pk  primary  key(deptno,dname));
Table created.

在上表中的其中一列建立索引,可以成功。

SQL> create  index  tt  on  dept(dname);
Index created.