1. 非空约束 not nul
2. 唯一约束 unique
每一个列上的数据是不允许重复的数据
3. 主键约束 (Primary Key)一般作为数据的唯一的一个标记出现 100%
主键约束(不为空,且唯一) = 非空约束 + 唯一约束
复合主键 constraint PK_id_name Primary Key (id,name) 约束的命名方式 复合主键基本不用(开发)
4. 检查约束 check
constraint ck_sex check (sex in ('男','女',人妖'')),
constraint ck_age check (age between 0 and 100)
检查的操作就是对数据的一个过滤
5. 主-外键约束 (核心) 涉及两张表,父子关系,子表中某个字段的取值范围由父表所决定
constraint fk_id Foreign Key (id) references table (id)
适用外键的好处是控制了子表中某些数据的取值范围,但同样带来一些问题。
若主表中有数据对应子表数据,则不能直接删除主表的数据。此时只能先删除子表记录,后才能删除主表记录。
a. 但这种操作很不方便,所以在建立外键约束的时候,指定一个级联删除的功能,修改数据库创建脚本:
constraint fk_id foreign key (id) references table (id) on delete cascade,此时由于存在级联删除的操作,所以在删除了主表的记录之后,相对应的子表的数据也被同时删除。
b.a的删除方式泰国霸道,因此:
删除了主表的记录之后,将其所对应的子表的数据置为null,而不是删除。修改数据库的创建脚本。
constraint fk_id foreign key (id) references table (id) on delete set null
c.删除父表之前必须删除对应的子表,否则无法删除
但是这样能做很麻烦,因为对于一个未知的数据库,如果按照此类方式进行,则必须先知道其父子关系。
因此在Oracle中提供了一个强制性删除表的操作,即:不再关心约束。
在删除的时候 drop table [表名] cascade constraint
此时不关心子表是否存在。
修改约束
1.为表增加约束
alter table 表名 add constraint 约束名称 约束类型[字段]
2.删除表中的约束
alter table 表名 drop constraint 约束名称
对于非空约束 无法操作(现在我已知)。
查询约束
在Oracle中所有的对象都是保存在数据字典中,约束亦然。
select * from user_constraints;
select * from user_cons_columns;