随笔-数据库-约束
程序员文章站
2022-05-06 22:53:28
...
目录
1、什么是约束?
约束是一种自动保持数据库完整性的一种方法,定义了数据库表及表字段中数据的限制条件,约束分为列级约束和表级约束,区别如下:
2、约束特点
- 主键约束(Primay Key Coustraint):字段值唯一并且不为空。
- 唯一约束(Unique Counstraint):字段值唯一,值可为空,并且表中可存在多个null值。
- 检查约束(Check Counstraint):对字段值进行长度、大小等限制。
- 外键约束(Foreign Key Counstraint):建立两个表之间的关联关系。主表字段值必须是唯一的。
- 默认(Default Counstraint):为字段设置默认值。当添加多个约束时,默认约束必须为第一个。
- 非空约束:限定字段值不为空。
3、创建约束
3.1、建表时创建列级约束
-- 创建列级约束
create table student_one(
stuid number primary key, -- 主键约束
studentno varchar2(100) unique, -- 唯一约束
studentname varchar2(200) not null check(length(studentname) > 2), -- 非空约束 检查约束 (多个约束通过空格分开)
createtime date default sysdate -- 默认约束
);
3.2、建表时创建表级约束
create table class_one(
classid number primary key, -- 主键约束
classname varchar2(100) unique -- 唯一约束
);
-- 创建表级约束
create table student_two(
stuid number,
studentno varchar2(100),
studentname varchar2(200) not null, -- 非空约束
createtime date default sysdate, -- 默认约束
classid number,
primary key(stuid), -- 主键约束
unique(studentno), -- 唯一约束
check(length(studentname) > 2), -- 检查约束
foreign key(classid) references class_one(classid)-- 外键约束 (多个约束通过逗号分开)
);
3.3、建表后加约束
create table class_three(
classid number primary key, -- 主键约束
classname varchar2(100) unique -- 唯一约束
);
create table student_three(
stuid number,
studentno varchar2(100),
studentname varchar2(200),
createtime date,
classid number
);
-- 主键约束
alter table student_three add primary key(stuid);
-- 唯一约束
alter table student_three add unique(studentno);
-- 检查约束
alter table student_three add check(length(studentname) > 2);
-- 外键约束(一般外键约束)
alter table student_three add foreign key(classid) references class_three(classid);
-- 外键约束(删除主表时也同时删除子表对应记录)
alter table student_three add foreign key(classid) references class_three(classid) on delete cascade;
-- 外键约束(删除主表时, 将子表的字段设置为null)
alter table student_three add foreign key(classid) references class_three(classid) on delete set null;
-- 默认约束
alter table student_three modify createtime default sysdate;
-- 非空约束
alter table student_three modify studentname not null;
4、约束命名
4.1、命名原则
- 主键约束:PK_字段名
- 唯一约束:UQ_字段名
- 检查约束:CK_字段名
- 非空约束:NN_字段名
- default(默认)约束:无
- 外键约束:FK_子表字段名_主表
约束命名:constraint + 约束名称
由于约束名称是全表共用的,所以建议加约束名时(当多表存在的字段名称重复)加上表名或其他标识区分,以下事例中由于表不多,所以未加表名区分。
4.1、列级约束命名
create table student_one(
stuid number constraint pk_stuid primary key, -- 主键约束
studentno varchar2(100) constraint uq_studentno unique, -- 唯一约束
studentname varchar2(200) constraint nn_studentname not null constraint ck_studentname check(length(studentname) > 2), -- 非空约束 检查约束 (多个约束通过空格分开)
createtime date default sysdate -- 默认约束
);
4.2、表级约束命名
create table class_one(
classid number primary key, -- 主键约束
classname varchar2(100) unique -- 唯一约束
);
-- 创建表级约束
create table student_two(
stuid number,
studentno varchar2(100),
studentname varchar2(200) not null, -- 非空约束
createtime date default sysdate, -- 默认约束
classid number,
constraint pk_stuid primary key(stuid), -- 主键约束
constraint uq_studentno unique(studentno), -- 唯一约束
constraint ck_studentname check(length(studentname) > 2), -- 检查约束
constraint fk_classid_classone foreign key(classid) references class_one(classid)-- 外键约束 (多个约束通过逗号分开)
);
4.3、建表后加约束
create table class_four(
classid number primary key, -- 主键约束
classname varchar2(100) unique -- 唯一约束
);
create table student_four(
stuid number,
studentno varchar2(100),
studentname varchar2(200),
createtime date,
classid number
);
-- 主键约束
alter table student_four add constraints pk_stuid primary key(stuid);
-- 唯一约束
alter table student_four add constraints uq_studentno unique(studentno);
-- 检查约束
alter table student_four add constraints ck_studentname check(length(studentname) > 2);
-- 外键约束(一般外键约束)
alter table student_four add constraint fk_classid_classfour foreign key(classid) references class_four(classid);
-- 外键约束(删除主表时也同时删除子表对应记录)
alter table student_four add constraint fk_classid_classfour foreign key(classid) references class_four(classid) on delete cascade;
-- 外键约束(删除主表时, 将子表的字段设置为null)
alter table student_four add constraint fk_classid_classfour foreign key(classid) references class_four(classid) on delete set null;
-- 默认约束
alter table student_four modify createtime default sysdate;
-- 非空约束
alter table student_four modify studentname constraints nn_studentname not null;
5、约束操作
-- 删除约束
alter table student_four drop constraints pk_stuid;
alter table student_four drop constraints uq_studentno;
alter table student_four drop constraints ck_studentname;
alter table student_four drop constraints fk_classid_classfour;
alter table student_four drop constraints nn_studentname;
alter table student_four modify studentname default null; -- 特殊
-- 启用约束
alter table student_four enable constraints pk_stuid;
alter table student_four enable constraints uq_studentno;
alter table student_four enable constraints ck_studentname;
-- 如果被引用了需要加 CASCADE
alter table student_four enable constraints fk_classid_classfour /*CASCADE*/;
alter table student_four enable constraints nn_studentname;
-- 关闭约束
alter table student_four disable constraints pk_stuid;
alter table student_four disable constraints uq_studentno;
alter table student_four disable constraints ck_studentname;
-- 如果被引用了需要加 CASCADE
alter table student_four disable constraints fk_classid_classfour /*CASCADE*/;
alter table student_four disable constraints nn_studentname;
下一篇: 数据库,数据表的创建及数据表的约束