介绍
“约束”是一种对数据表字段存储数据的限制,分为主键(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 |
外键约束
外键会将两个数据表进行关联(子表字段数据来源主表,注:子表相应字段可为 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种。
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()
not null
约束
添加约束命令:
alter table 表名 modify(字段 constraint 约束名 not null) |
因为not null
约束仅能定义于字段,即列约束,故不能使用...add constraint...
命令添加。
最后
掌握约束,我建议:少用可视化工具(如:plsql、navicat)操作,手打命令。