欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

随笔-数据库-约束

程序员文章站 2022-05-06 22:53:28
...

目录

1、什么是约束?

2、约束特点

3、创建约束

3.1、建表时创建列级约束

3.2、建表时创建表级约束

3.3、建表后加约束

4、约束命名

4.1、命名原则

4.1、列级约束命名

4.2、表级约束命名

4.3、建表后加约束

5、约束操作


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;

 

相关标签: 数据库