约束
数据类型可以说是控制输入数据的格式,而约束则是控制输入的数据满足一些特定的要求。
- 约束的作用
约束最重要的一个作用是用来定义规则,比如哪些字段是必须要输入的,哪些字段的值应该在一个怎么样的范围之内等,定义的一定的规则之后,就可以确保数据的完整性(即精确性和可靠性),就可以防止输入一些错误的或者无效的信息。 - 五类约束
- 非空约束
- 主键约束
- 外键约束
- 唯一约束
- 检查约束
1.非空约束(非空约束没有名字)
- 在创建表时设置非空约束
使用NOT NULL设置:
CREATE TABLE table_name(
column_name datatype NOT NULL,...
);
还是以userinfo表为例,表中有ID、USERNAME、USERPWD、REGDATE四个字段。
create table userinfo
(id, number(6,0),
username varchar2(20) not null,
userpwd varchar2(20) not null,
regdate date);
- 在修改表时添加非空约束
在修改表时添加非空约束,被约束字段不能已经存在空值。
ALTER TABLE table_name
MODIFY column_name datatype NOT NULL;
- 在修改表时去除非空约束
ALTER TABLE table_name
MODIFY column_name datatype NULL;
2. 主键约束
作用:确保表中每一行数据的唯一性,要求主键是非空并且唯一的。
在一张表中只能设置一个主键约束,但是主键约束可以由多个字段来构成(联合主键或复合主键)。
- 在创建表时设置主键约束
方法一
CREATE TABLE table_name(
column_name datatype PRIMARY KEY, ...
);
方法二
...创建字段...
CONSTRAINT constraint_name
PRIMARY KEY(column_name1,...);
例如:
create table userinfo
(id number(6,0),
username varchar2(20),
userpwd varchar2(20),
regdate date,
constraint pk_id_username primary key(id, username));
查看约束的名字
通过数据字典user_constraints可以查看某张表的约束名字:
select constraint_name from user_constraints where table_name='USERINFO';
没有特别声明的约束,名称由系统自动生成。
- 在修改表时添加主键约束
ALTER TABLE table_name
ADD CONSTRAINT constraint_name
PRIMARY KEY (column_name1,...);
例如
alter table userinfo
add constraint pk_id primary key(id);
同样,修改为主键的字段内的数据内容要符合主键约束,在设定主键之前表中最好没有数据。
- 更改约束的名称(注意约束的名字需要是唯一的)
ALTER TABLE table_name
RENAME CONSTRAINT old_name
TO new_name;
- 删除主键约束
禁用/启用约束
ALTER TABLE table_name
DISABLE|ENABLE CONSTRAINT constraint_name;
查看约束状态
select constraint_name,status from user_constraints where table_name='USERINFO';
删除约束
ALTER TABLE table_name
DROP CONSTRAINT constraint_name; 或者
DROP PRIMARY KEY[CASCADE] --CASCADE用于级联删除
3. 外键约束
外键约束是唯一一个涉及两个表当中字段关系的约束。
- 在创建表时设置外键约束
方法一
CREATE TABLE table1
(column_name datatype REFERENCES
table2(column_name), ...);
其中table2称为主表,table1称为从表,
设置外键约束时,主表的字段必须是主键,主从表中相应的字段必须是用一个数据类型,
从表中外键字段的值必须来自主表中相应字段的值,或者为null值。
例如:
创建主表
create table typeinfo
(typeid varchar2(10) primary key,
typename varchar2(20));
创建从表
create table userinfo_f
(id varchar2(10) primary key,
username varchar2(20),
typeid_f varchar2(10) references typeinfo(typeid));
方法二
...创建字段...
CONSTRAINT constraint_name FOREIGN
KEY(column_name) REFERENCES
table_name(column_name) [ON DELETE CASCADE]; --级联删除
例如:
create table userinfo_f
(id varchar2(10) primary key,
username varchar2(20),
typeid_f varchar2(10),
constraint fk_typeid_f foreign key(typeid_f) references typeinfo(typeid));
- 在修改表时添加外键约束
ALTER TABLE table_name1
ADD CONSTRAINT constraint_name FOREIGN
KEY(column_name) REFERENCES
table_name2(column_name) [ON DELETE CASCADE];
- 删除外键约束
禁用/启用外键约束
ALTER TABLE table_name
DISABLE|ENABLE CONSTRAINT constraint_name;
删除外键约束
DROP CONSTRAINT constraint_name;
4. 唯一约束
作用:使设置了唯一约束的字段当中的值唯一。
唯一约束和主键约束的区别:
主键字段的值必须是非空的,而唯一约束允许有一个空值,主键在每张表中只能有一个,而唯一约束可以有很多个。
- 在创建表时设置唯一约束
方法一
CREATE TABLE table_name
(column_name datatype UNIQUE,...);
方法二
...创建字段...
CONSTRAINT constraint_name
UNIQUE(column_name); --多个字段的设定要使用多条constraint子句
例如
create table userinfo
(id varchar2(10) primary key,
username varchar2(20),
constraint un_username unique(username));
- 在修改表时添加唯一约束
ALTER TABLE table_name
ADD CONSTRAINT constraint_name
UNIQUE(column_name);
- 删除唯一约束
禁用/启用唯一约束
ALTER TABLE table_name
DISABLE | ENABLE CONSTRAINT constraint_name;
删除唯一约束
DROP CONSTRAINT constraint_name;
5. 检查约束
作用:让表中的值更具有实际意义,比如员工信息管理系统,记录了员工的年龄、工资等信息,检查约束可以让这些数据的值满足一定条件从而具有实际意义。
- 在创建表时设置检查约束
方法一
CREATE TABLE table_name
(column_name datatype CHECK(expressions),...);
例如
create table userinfo
(id varchar2(10) primary key,
username varchar2(20),
salary number(7,0) check(salary>0));
方法二
...创建字段...
CONSTRAINT constraint_name
CHECK(expressions);
- 在修改表时添加检查约束
ALTER TABLE table_name
ADD CONSTRAINT constraint_name
CHECK(expressions);
- 删除检查约束
禁用/启用检查约束
ALTER TABLE table_name
DISABLE | ENABLE CONSTRAINT constraint_name;
删除检查约束
DROP CONSTRAINT constraint_name;