向ID列插入一个0试试:
gyj@OCM> insert into t2(id) values(0);
insert into t2(id) values(0)
*
ERROR at line 1:
ORA-02290: check constraint (GYJ.C_ID_1) violated
像上面这样把约束的创建,直接放在列的后,这种方式创建的约束,被称为列级约束,也简称列约束。除了列级约束,还有表级约束,简称表约束。从隶属关系上来讲,列约束的相关信息,和列存储在一起,因此说列约束是属于列的。而表约束的相关信息,则和表存贮在一起,表约束属于表。从功能上讲,列约束和表约束是一样的。创建方式也非常的相似,下面我们建立一个属于表的CHECK约束:
gyj@OCM> drop table t2;
Table dropped.
gyj@OCM> create table t2(id number(10), name varchar2(20),constraint t2_id_1 check (id>=1) );
Table created.
也就是约束并不跟在列之后定义,而是在在所有列之后,另行定义。这样创建的约束,就是在表级创建约束,也就表约束。但是我们要明白,其实表约束仍是约束表中的列的,它仍是对列发挥作用,只不过像上面t2_id_1约束的信息,被存贮在表层,和表放在一起。
约束中,非空约束必须是列约束。其他类型的约束都即可以是列约束,也可以创建为表约束。不过和列约束相比,表约束有一个列约束所不能提供的功能,就是,一个表约束中可以涉及多列:
gyj@OCM> drop table t2;
Table dropped.
gyj@OCM> create table t2(id number(10),
2 age number(3),
3 name varchar2(20),
4 company varchar2(40),
5 constraint t2_id_1 check (id>=age ) );
Table created.
此约束的意义是规定ID列必须大于等于AGE列的值。像这样涉及两个列的约束,必须在表级创建。在列级创建的约束,只能针对某一个列。
如果是在创建表后再添加约束,命令如下:
gyj@OCM> drop table t2;
Table dropped.
gyj@OCM> create table t2(id number(10), age number(3), name varchar2(20), company varchar2(40));
Table created.
gyj@OCM> alter table t2 add(constraint t2_id_age_c check (id>age));
Table altered.
和添加非空约束相比,仍然是使用ALTER TABLE命令,但不在是MODIFY,而是ADD。这条命令也可以用来为表新增列除了非空约束外,其他类型的约束必须使用此命令添加。这样添加的约束,都是表级约束。
还有就是,在添加约束时,CHECK约束的条件有可能互相冲突:
gyj@OCM> drop table t2;
Table dropped.
gyj@OCM> create table t2(id number(10), age number(3), name varchar2(20), company varchar2(40));
Table created.
gyj@OCM> alter table t2 add(constraint t2_id_11 check (id>=1 ));
Table altered.
gyj@OCM> alter table t2 add(constraint t2_id_12 check (id<=0 ));
Table altered.
我添加了两个约束,分别是t2_id_11和t2_id_12,两个约束都针对ID列,一个约束规定ID列的值一定要大于等于1,另一约束规定ID定必须小于等于0。现在,除了NULL值,ID列再也插入不进去任何值。
3、唯一约束 UNIQUE
唯一约束限制了列的值不能有重复。唯一约束必须依赖索引,在创建唯一约束时,将会同时创建相应的索引。有关索引的内容,我们到后面再讲。下面看一下如何创建唯一约束:
gyj@OCM> drop table t2;
Table dropped.
gyj@OCM> create table t2(id number(10) constraint c_t2_id unique, age number(3), name varchar2(20));
Table created.
这是在列级定义约束,约束只针对一列。如果想让ID列和AGE列合起来唯一,而单独的ID列和AGE列可以重复,这就是在表中定义约束了。涉及多列的约束,只能在表级创建。
gyj@OCM> drop table t2;
Table dropped.
gyj@OCM> create table t2(id number(10),
2 age number(3),
3 name varchar2(20),
4 constraint t2_id_age_u unique(id,age));
Table created.
在表创建后添加索引命令和添回CHECK差不多,我就不再做测试了。
4、主键 PRIMARY KEY
主键约束在效果上,相当于唯一约束+非空约束。也就是,即要求列值不能重复,又要求列值必须非空。
主键约束的创建方式、注意事项,除了把UNIQUE换为PRIMARY KEY外,都和唯一约束相同,关于他的创建,我们到下面和外键约束一起试。要注意的是,在同一列上,不能即有主键约束,又有唯一约束。
5、外键 FOREIGN KEY
主键约束可以单独发挥作用,它的作用相当于唯一+非空。而外键约束则必须主键结合在一起使用。在创建创建约束时,先必须先有一个主键,然后,根据此主键,创建一个相关联的外键约束。也就是说,外键约束必须对应一个主键,不能创建独立的外键约束。
主、外键约束通常创建在不同的表上,通过主、外键关系,可以将不同的表关联起来。外键约束的创建方式、注意事项,和主键约束、唯一约束相同。下面我们通过一个例子,来了解一下他的创建方式和作用:
我建立如下两个表:
gyj@OCM> create table emp1(id number(10), name varchar2(20), dept_id number(10));
Table created.
gyj@OCM> create table dept1(dept_id number(10), dept_name varchar2(20));
Table created.
emp1表是雇员表,包含雇员ID(ID)、姓名(NAME)和部门编号(DEPT)三列。
dept1表是部门表,包括部门编号(DEPT)、部门名称(DEPT_NAME)两列。
这两个表有对应的关系,雇员表的部门编号(DEPT)列,和部门表的部门编号(DEPT)列就是对应的。通常我们可以用这个列作等值连接,将两个表连接在一起显示更详细的信息。现在,需要对这两个表中的相关部门的列作出一些限制。比如,