当我们创建表的时候,同时可以指定所插入数据的一些规则,比如说某个字段不能为空值,某个字段的值(比如年龄)不能小于零等等,这些规则称为约束。约束是在表上强制执行的数据校验规则.
Oracle 支持下面五类完整性约束:
NOT NULL 非空
UNIQUE Key 唯一键
PRIMARY KEY 主键
FOREIGN KEY 外键
CHECK 自定义检查约束
Oracle使用SYS_Cn格式命名约束,也可以由用户命名
创建约束的时机
在建表的同时创建
建表后创建
约束从作用上分类,可以分成两大类:
表级约束:可以约束表中的任意一列或多列。可以定义除了Not Null以外的任何约束。
列级约束:只能约束其所在的某一列。可以定义任何约束。
约束简介
约束用于确保数据库数据满足特定的商业逻辑或者企业规则,如果定义了约束,并且数据不符
合约束,那么DML操作(INSERT、UPDATE、DELETE)将不能成功执行。约束包括NOT NULL、UNIQUE、PRIMARY KEY、FOREING KEY 以及CHECK等五种类型
定义约束
列级约束:
column [CONSTRAINT constraint_name] constraint_type
表级约束:
column ,...,
[CONSTRAINT constraint_name] constraint_type (column,...)
1.定义NOT NULL约束
NOT NULL 约束只能在列级定义,不能在表级定义
例:
CREATE TABLE emp01(
eno INT NOT NULL,
name VARCHAR2(10) CONSTRAINT nn_name2 NOT NULL,
salary NUMBER(6,2)
);
列级约束: 从形式上看,在每列定义完后马上定义的约束,在逗号之前就定义好了。
carete table parent(c1 number primary key );
create table child (c number primary key , c2 number references parent(c1));
表级约束: 从形式上可以看出与列级约束的区别了吧。
create table child( c number , c2 number , primary key (c2), foreign key(c2) references parent(c1));
1主键约束( PRIMARY KEY)
主键约束是数据库中最重要的一种约束。在关系中,主键值不可为空,也不允许出现重复,即关系要满足实体完整性规则。
主键从功能上看相当于非空且唯一
一个表中只允许一个主键
主键是表中能够唯一确定一个行数据的字段
主键字段可以是单字段或者是多字段的组合
Oracle为主键创建对应的唯一性索引
建议命名
约束_表名_字段 可以保证唯一性。 如果太长,可用缩写。
同一字段可以有多个约束,但是约束之间不要冲突
主键可用下列两种形式之一定义
主键子句
在表的定义中加上如下子句 primary key(列)
主键短语
在主属性的定义之后加上primary key字样。
上述形式Oracle会自动命名约束,可自己给约束起名
create table t3(
id number(4),
constraint t3_pk primary key(id)
)
create table sxtstu01(
sid number(10) primary key,
sname varchar2(50) not null
)
create table sxtstu02(
sid number(10),
sname varchar2(50) not null,
constraint pk_sid_test primary key(sid)
)
create table sxtstu03(
sid number(10),
sno varchar2(10),
sname varchar2(50) not null,
constraint pk_sid_test01 primary key(sid,sno)
)
2.非空约束(NOT NULL)
确保字段值不允许为空
只能在字段级定义
CREATE TABLE employees(
employee_id NUMBER(6),
name VARCHAR2(25) NOT NULL,
salary NUMBER(8,2),
hire_date DATE CONSTRAINT emp_hire_date_nn NOT NULL
)
create table sxtstu04(
sid number(10),
sno varchar2(10),
sname varchar2(50) not null,
birthday date constraint nn_sxtstu04_birthday not null,
constraint pk_sxtstu04_sid primary key(sid)
)
3.唯一性约束(UNIQUE)
唯一性约束条件确保所在的字段或者字段组合不出现重复值
唯一性约束条件的字段允许出现空值
Oracle将为唯一性约束条件创建对应的唯一性索引
CREATE TABLE employees(
id NUMBER(6),
name VARCHAR2(25) NOT NULL UNIQUE,
email VARCHAR2(25),
salary NUMBER(8,2),
hire_date DATE NOT NULL,
CONSTRAINT emp_email_uk UNIQUE(email)
);
4.CHECK 约束
Check约束用于对一个属性的值加以限制
在check中定义检查的条件表达式,数据需要符合设置的条件
create table emp3
( id number(4) primary key,
age number(2) check(age > 0 and age < 100),
salary number(7,2),
sex char(1),
constraint salary_check check(salary > 0)
)
在这种约束下,插入记录或修改记录时,系统要测试新的记录的值是否满足条件
5.外键约束( FOREIGN KEY)
外键是表中的一个列,其值必须在另一表的主键或者唯一键中列出
作为主键的表称为“主表”,作为外键的关系称为“依赖表”
外键参照的是主表的主键或者唯一键
对于主表的删除和修改主键值的操作,会对依赖关系产生影响,以删除为例:当要删除主表的某个记录(即删除一个主键值,那么对依赖的影响可采取下列3种做法:
RESTRICT方式:只有当依赖表中没有一个外键值与要删除的主表中主键值相对应时,才可执行删除操作。
CASCADE方式:将依赖表中所有外键值与主表中要删除的主键值相对应的记录一起删除
SET NULL方式:将依赖表中所有与主表中被删除的主键值相对应的外键值设为空值
FOREIGN KEY (DEPTNO) REFERENCES DEPT(DEPTNO)
[ON DELETE [CASCADE|SET NULL]] 如省略on短语,缺省为第一中处理方式。