(数据库)13_约束constraint

一、什么是约束

有以下五种约束:

  1. NOT NULL 非空约束
  2. UNIQUE 唯一约束
  3. PRIMARY KEY 主键约束
  4. FOREIGN KEY 外键约束
  5. CHECK 检查约束

注意事项

  1. 如果不指定约束名 ,Oracle server 自动按照 SYS_Cn 的格式指定约束名
  2. 创建修改约束:
    建表的同时
    建表之后
  3. 可以在表级列级定义约束
  4. 可以通过数据字典视图查看约束

二、表级约束和列级约束

  1. 作用范围:
    列级约束只能作用在一个列上
    表级约束可以作用在多个列上(当然表级约束也可以作用在一个列上)
  2. 定义方式: 列约束必须跟在列的定义后面,表约束不与列一起,而是单独定义。
  3. 非空(not null) 约束只能定义在列上

三、定义约束

CREATE TABLE employees(
         employee_id  NUMBER(6),
         first_name   VARCHAR2(20),
         ...
         job_id       VARCHAR2(10) NOT NULL,
       CONSTRAINT emp_emp_id_pk
               PRIMARY KEY (EMPLOYEE_ID));

1.NOT NULL 约束(非空约束)

保证列值不能为空: 只能定义在列上

--在创建表的同时 为表中的列条件非空约束
create table STUDENT
(
  stu_id   NUMBER  not null,
  stu_name VARCHAR2(50) CONSTRAINT  stu_name_null not null,
  stu_age  NUMBER,
  stu_sex  VARCHAR2(10),
  cls_id   NUMBER
)

在这里插入图片描述

2.UNIQUE 约束 (唯一约束)

添加了唯一约束的列中的值不允许重复

--在创建表的同时 为表中的列条件非空约束
create table STUDENT
(
  stu_id   NUMBER  not null,
  stu_name VARCHAR2(50) UNIQUE --唯一约束 ,
  stu_age  NUMBER,
  stu_sex  VARCHAR2(10),
  cls_id   NUMBER
)

唯一约束,允许出现多个空值:NULL。

3.PRIMARY KEY 约束(主键约束)

主键约束 = 非空约束 + 唯一约束
在主键列的定义上 采用数据值唯一的列来作为主键列 一般在数据表定义的时候 都会定义一个冗余的无意义的列来作为主键列
如果采用有意义的列 不能保证该列永远满足唯一约束

create table STUDENT
(
  stu_id   NUMBER  not null,
  stu_name VARCHAR2(50) UNIQUE, --唯一约束 ,
  stu_age  NUMBER,
  stu_sex  VARCHAR2(10),
  cls_id   NUMBER,
  constraint pk_stu_id primary key(stu_id)--主键约束
)

在这里插入图片描述

create table STUDENT
(
  stu_id   NUMBER  not null,
  stu_name VARCHAR2(50) UNIQUE, --唯一约束 ,
  stu_age  NUMBER,
  stu_sex  VARCHAR2(10),
  cls_id   NUMBER,
  constraint pk_stu_id_name primary key(stu_id,stu_name)--主键约束  联合主键
 )

4.FOREIGN KEY 约束(外键约束)

表与表之间的关系: 一对一 一对多 多对一 多对多

一对一:一夫一妻制
一对多/多对一:员工和部门之间管
多对多:订单和商品    用户和权限

关系的维护:

一对一的关系维护可以在任意一方来维护
一对多/多对一 往往一方来维护
多对多:需要借助与第三张表 来维护这种关系

表的设计:以一对多为例:在一方的表中 设计一个冗余字段 来保存自己与多方的关系
employees中有一个department_id
为了保证在插入数据的时候 不至于出现非法数据 所以在建表的时候 就会为表来指定外键约束

 CONSTRAINT emp_dept_fk FOREIGN KEY (department_id)
      REFERENCES departments(department_id),

1.FOREIGN KEY 约束的关键字

  1. FOREIGN KEY: 在表级指定子表中的列
  2. REFERENCES: 标示在父表中的列

在添加外键约束的时候 对于所关联的表中的字段(class表中的cls_id) 该字段必须是主键列或者有唯一约束

create table STUDENT
(
  stu_id   NUMBER not null,
  stu_name VARCHAR2(50) not null,
  stu_age  NUMBER,
  stu_sex  VARCHAR2(10),
  cls_id   NUMBER,
  CONSTRAINT stu_cls_fk FOREIGN KEY(cls_id)
   REFERENCES class(cls_id)--外键约束
);

在这里插入图片描述

对于外键约束中
关联的表为主表(class) 维护关系的表称为从表(student)
删除从表数据 不会对主表数据产生影响 可以直接删除
删除主表数据 会对从表数据产生影响 必须指定删除的策略 删除主表数据时 对从表数据的一个处理方式:

  1. ON DELETE CASCADE(级联删除): 当父表中的列被删除时,子表中相对应的列也被删除
  2. ON DELETE SET NULL(级联置空/级联更新): 子表中相应的列置空
create table STUDENT
(
  stu_id   NUMBER not null,
  stu_name VARCHAR2(50) not null,
  stu_age  NUMBER,
  stu_sex  VARCHAR2(10),
  cls_id   NUMBER,
  CONSTRAINT stu_cls_fk FOREIGN KEY(cls_id)
   REFERENCES class(cls_id) on delete CASCADE--外键约束  同时设置删除策略为级联删除
);

delete from class where cls_id = 1;
create table STUDENT
(
  stu_id   NUMBER not null,
  stu_name VARCHAR2(50) not null,
  stu_age  NUMBER,
  stu_sex  VARCHAR2(10),
  cls_id   NUMBER,
  CONSTRAINT stu_cls_fk FOREIGN KEY(cls_id)
   REFERENCES class(cls_id) on delete set null--外键约束  同时设置删除策略为级联置空
);

在这里插入图片描述

5.CHECK 约束

定义每一行必须满足的条件

create table STUDENT
(
  stu_id   NUMBER not null,
  stu_name VARCHAR2(50) not null,
  stu_age  NUMBER,
  stu_sex  VARCHAR2(10) ,
  cls_id   NUMBER,
  CONSTRAINT stu_cls_fk FOREIGN KEY(cls_id)
   REFERENCES class(cls_id) on delete set null,--外键约束  同时设置删除策略为级联置空
   CONSTRAINT stu_sex_ck  check (stu_sex in('男','女'))
);
create table STUDENT
(
  stu_id   NUMBER not null,
  stu_name VARCHAR2(50) not null,
  stu_age  NUMBER,
  stu_sex  VARCHAR2(10) ,
  cls_id   NUMBER,
  CONSTRAINT stu_cls_fk FOREIGN KEY(cls_id)
   REFERENCES class(cls_id) on delete set null,--外键约束  同时设置删除策略为级联置空
   CONSTRAINT stu_sex_ck  check (stu_sex in('男','女')),--检查约束
   constraint stu_age_ck check(stu_age >18 and stu_age < 50)--设置年龄的范围为18-50岁
);

在这里插入图片描述

四、添加约束的语法

使用 ALTER TABLE 语句:

  1. 添加或删除约束,但是不能修改约束
  2. 有效化或无效化约束
  3. 添加 NOT NULL 约束要使用 MODIFY 语句
ALTER TABLE  table ADD [CONSTRAINT constraint] type (column);
--给student 表添加检查约束
alter table  student add constraint stu_age_ck check (stu_age > 18);

以create table emp as select * from employees;为例,添加和删除约束

Alter table emp modify(empname varchar2(50) not null);
--添加非空约束
alter table student modify (stu_name varchar2(100) not null);

五、删除约束

删除时该约束必须存在

--删除约束
alter table student drop constraint stu_sex_ck;

六、无效化约束

在ALTER TABLE 语句中使用 DISABLE 子句将约束无效化

--无效化约束
alter table student disable constraint stu_sex_ck;

七、激活约束

ENABLE 子句可将当前无效的约束激活

--激活约束
alter table student enable constraint stu_sex_ck;

当定义或激活UNIQUE 或 PRIMARY KEY 约束时系统会自动创建UNIQUE 或 PRIMARY KEY索引

八、查询约束

查询数据字典视图 USER_CONSTRAINTS

--查询约束 注意过滤条件中的表名要大写
select * from user_constraints where table_name='STUDENT';

九、查询定义约束的列

查询数据字典视图 USER_CONS_COLUMNS

--查询定义约束的列
select * from user_cons_columns where table_name='STUDENT';

在这里插入图片描述

总 结

通过本章学习,您已经学会如何创建约束描述约束的类型:

  1. NOT NULL
  2. UNIQUE
  3. PRIMARY KEY
  4. FOREIGN KEY
  5. CHECK
发布了67 篇原创文章 · 获赞 6 · 访问量 1926

猜你喜欢

转载自blog.csdn.net/weixin_45801537/article/details/104382680