【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)
https://developer.aliyun.com/article/1634559
出自【进步*于辰的博客】参考笔记一,P22.18~22。
1、介绍
“约束”是一种对数据表字段存储数据的限制,分为主键(primary key
)、唯一键(unique
)、外键(foreign key
)、check
约束、not null
约束。
操作命令:
--添加约束--
alter table 表名 add constraint 约束名 约束类型(字段);
--删除约束--
alter table 表名 drop constraint 约束名;
--启用/禁用约束--
alter table 表名 enable/disable constraint 约束名;
数据字典:
--当前用户旗下所有数据表的所有约束--
user_constraints
--当前用户旗下所有数据表的所有约束所属的字段名--
user_cons_columns
2、外键约束
外键会将两个数据表进行关联(子表字段数据来源主表,注:子表相应字段可为 null),进而对子表相应字段的数据进行限制。
创建命令:
alter table 子表 add constraint 外键名 foreign key(字段1) references 主表(字段2);
这里就有个问题:若主表记录被删除,那么子表中相应数据该何去何从?
可在上述命令后增加一条子句,可以决定这些数据的去向,4种定义:
on delete cascade
:表示子表中相应数据将连同删除;on delete set null
:表示子表中相应数据将被置空(null
);Restrict
:表示若子表中存在相应数据,则提示主表记录不能删除;on delete no action
:表示子表不受影响。
这种机制也称为“级联删除”。必然的,另一种是“级联更新”,即on update
,其取值也是以上4种。
3、check
约束
此约束用于限制数据范围,其内不允许使用伪列,如:rownum
。
创建命令:
alter table 表名 add constraint 约束名 check(条件);
示例:(注:创建命令是固定的,故示例中仅展示“条件”部分)
# 限制取值
sex in (0, 1)
# 限制范围
1、age > 0 and age < 120
2、age between 0 and 120
# 这样仅能用于限制整数,如“工资”此类的小数无法如此添加限制
# 限制模式
regexp_like(phone, '192\d{8}'); // 中国广电手机号
regexp_like(email, '\w+@[\w&&[^_]]+\.com'); // 邮箱
regexp_like(id_card, '^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$'); // 十八位身份证号
# 条件中可以使用函数,如sysdate、uid()、user()、userenv()
regexp_like()
可查阅博文《[Oracle]面试官:你举例几个内置函数,并且说说如何使用内置函数作正则匹配》中的【正则表达式相关函数】一栏。
4、not null
约束
添加约束命令:
alter table 表名 modify(字段 constraint 约束名 not null)
因为not null
约束仅能定义于字段,即列约束,故不能使用...add constraint...
命令添加。
最后
掌握约束,我建议:少用可视化工具(如:plsql、navicat)操作,手打命令。
本文完结。