约束的作用
1、定义规则。
2、确保完整性。
注意事项:
如果不指定约束名 ,Oracle server 自动按照 SYS_Cn 的格式指定约束名 创建和修改约束: 建表的同时 建表之后 可以在表级或列级定义约束 可以通过数据字典视图查看约束。
作用范围: ①列级约束只能作用在一个列上 ②表级约束可以作用在多个列上(当然表级约束也 可以作用在一个列上)
定义方式: 列约束必须跟在列的定义后面,表约束不与列一起,而是单独定义。
表级约束:
A、定义列级约束:
create table 表名 (字段名 字段数据类型 constraint 自己定义的约束名 约束类型......);
B、定义列级约束:
定义在表机构写完以后定义的约束。
create table 表名 (。。。。。。。constraint 自己定义的约束名 约束类型(字段名1、字段名2.。。));
C、查找约束名:
select constarint_name from user_constarint where table_name='表名';
D、更改约束名:
alter table 表名 rename constraint 旧的约束名 to 新的约束名;
E、禁用约束:
alter table 表名 disable constraint 约束名;
F、禁用约束:
alter table 表名 ensable constraint 约束名;
G、查找约束状态:
select constraint_name,status from user_constraint where table_name='表名';
H、删除约束:
alter table 表名 drop constraint 约束名;
alter table 表名 drop 约束类型;(例如表中的主键,就可以直接删除)
I、查找约束名、类型、约束条件:
select constraint_name , constraint_type, search_condition from user_conditions
where table_name='要查找的表名';
1、非空(not null) 约束:
非空(not null) 约束只能定义在列上。
在创建表时设置非空约束:
create table 表名 (字段名 字段数据类型 not null......);
例子:
CREATE TABLE USERINFO_t (
ID NUMBER (8,0) NOT NULL,
NAME NVARCHAR2 (8) NOT NULL
);
注意:在创建表时加非空约束,最好添加默认值(用default关键字添加),因为添加默认值,插入数据可能会报不能插入空值的错误。
在修改表时设置非空约束:
alter table 表名 motify 字段名 数据类型 not null;
例子:
ALTER TABLE USERINFO_T MODIFY NAME NVARCHAR2 (8) NOT NULL;
在修改时删除非空约束:
alter table 表名 modify 字段名 字段数据类型 null;
2、主键约束(primary key):
在创建表时设置主键约束:
create table 表名(字段名 数据类型 primary key..... );
在修改表时设置主键约束:
alter table 表名 add constraint 约束名 primary key(字段名。。。。。。);
3、外键约束(foreign key):
FOREIGN KEY: 在表级指定子(从)表中的列 。
REFERENCES: 标示在父(主)表中的列。
在创建表时设置外键约束:
create table 从表名 (从表字段1 字段1数据类型 从表字段1约束,......,constraint 约束名 foreign key(从表的字段名)
references 主表名(主表的主键) );
create table 从表名 (从表字段1 字段1数据类型 从表字段1约束,......,从表字段n 从表字段n数据类型
references 主表名(主表的主键) );
例如:
CREATE userinfo_t (
ID VARCHAR2 (8, 0) PRIMARY KEY,
NAME NVARCHAR2 (8) NOT NULL,
dept_userid NVARCHAR2(8) ,
constraint userinfo_t_dept_id foreign key(dept_userid) references deptinfo(dept_id)
);
注意:1.设置外键约束时,主表的字段必须是主键。
2.主从表相应的字段必须是同一个数据类型。
3.从表中外键约束的字段的值必须来自主表的相应字段的值,或者为null值。
ON DELETE CASCADE(级联删除): 当父(主)表中的列被删除时,子(从)表中相对应的列也被删除 。
ON DELETE SET NULL(级联置空): 子(从)表中相应的列置空。
这两种设置在建表的时候设置,例如:
CREATE userinfo_t (
ID VARCHAR2 (8, 0) PRIMARY KEY,
NAME NVARCHAR2 (8) NOT NULL,
dept_userid NVARCHAR2(8) ,
constraint userinfo_t_dept_id foreign key(dept_userid) references deptinfo(dept_id)
on DELETE cascade
);
在修改表时设置外键约束:
alter table 表名 add constraint 约束名 foreign key(从表的字段名)
references 主表名(主表的主键);
添加级联删除的:
add table 表名 constraint 约束名 foreign key(从表的字段名)
references 主表名(主表的主键) on DELETE cascade;
4、唯一约束(unique):
在创建表时设置唯一约束:
create table 表名 (字段名 字段数据类型 unique,......);列级定义
create table 表名 (字段名 字段数据类型 ,...... , constraint 约束名 unique(字段名));表级定义
例如:
create table user_info (id number(8,0) primary key,name nvarchar2(20) not null, ide_id number(8,0) unique );
在修改表时添加唯一约束:
alter table 表名 add constraint 约束名 unique(字段名);
例如:
alter table user_info add constraint un_name_new unique(name);
5、检查约束(cheak), 满足每一行必须满足的条件 :
在创建表时设置检查约束:
create table 表名 (字段名 字段数据类型 check(条件),......);列级定义
create table 表名 (字段名 字段数据类型 ,...... , constraint 约束名 check(条件));表级定义
例如:
create table user_info (id number(8,0) primary key,name nvarchar2(20) not null, salary
number(7,0) check(salary>0) );
在修改表时添加检查约束:
alter table 表名 add constraint 约束名 check(条件);
注意:在创建表时设置约束时,非空约束只能在列级设置,不能在表级设置。
参考来自慕课网和尚硅谷