• 【Oracle11g】05_完整性约束


    1.数据的完整性简介

    就是正确性、准确性,包含三种:实体完整性、参照完整性、用户自定义完整性。Oracle中主要通过约束、触发器、过程函数实现的。
    以下举例子说明:

    字段
    员工表 员工编号、员工名称、部门编号
    部门表 部门编号、部门名称
    学生表 学生编号、学生姓名、出生日期、当前日期

    实体完整性:员工表的员工编号是主键列,那么员工编号这一列的值不可能错误,显而易见,员工编号不能为负数,这就是实体完整性。
    参照完整性:员工表的外键是部门表,员工表中的部门编号必须是来自部门表的,这就是参照完整性。
    用户自定义完整性:对于学生表来说,任何一个学生的出生日期都是小于当前日期的,这就是自定义完整性。

    2.维护完整性的5种方式:not null、unique、check、primary key、foreign key

    • not null例如学生的姓名;unique例如学生的学号;primary key主键、foreign key外键、check可以按照用户要求,进行自动检查。
    • unique不可以重复,但是可以为空。
    • primary key不可以重复,也不能为空。
    • 一个表只能一个primary key,却可以多个unique。
    • not null只能在列内定义,其他4种约束可以在列定义结束后,在表内定义

    2.1 案例说明

    2.1.1 创建not null约束

    create table custInfo1(cust_no number not null,cust_name varchar2(20));
    -- 查看创建的约束
     select u.constraint_name,u.constraint_type,u.table_name,u.index_name  from user_constraints u;
    

    从下图可以看到刚刚给表custinfo1创建的约束

    2.1.2 创建check约束

    create table custInfo2(cust_no number not null check (cust_no>0 and cust_no<1000),cust_name varchar2(20));
    
    select u.constraint_name,u.constraint_type,u.table_name,u.index_name  from user_constraints u;
    

    通过下图可以看到表custinfo2存在2个约束,一个是not null 一个是check。

    同时,也可以通过表user_cons_columns查看约束与列的对应关系;

    select * from user_cons_columns;
    

    2.1.3 创建unique约束

    -- 现在有员工信息表,部门编号与部门内部编号才能唯一确定一条记录,所以根据部门编号和员工内部编号创建唯一性约束
    create table empInfo(dept_no number not null, emp_no number, cust_name varchar2(20), unique(dept_no,emp_no));
    

    查看创建的唯一性约束后发现,当为列创建唯一性约束的时候,同时也会自动创建索引。

    2.1.4 default的使用

    default适用于没有向列显示的指定数值的情况

    -- 例如:创建一个员工表,指定员工的默认工资为2000
     create table sal(empno number,ename varchar2(20),salary number(8,2) default 2000);
    
    -- 第一种插入
    insert into sal values(1,'AA',default);
    -- 第二种插入
    insert into sal(empno,ename) values(2,'BB');
    

    查询结果:

    2.1.5 主键primary key与外键foregin key

    create table student(stu_no number constraint pk_stu_no primary key, stu_name varchar2(40));
    -- 表city上的stu_no参照了student表的stu_no列,此处的外键名是由系统自动命名
    create table city(stu_no number, addr varchar2(20), foreign key(stu_no) references student(stu_no));
    

    3.创建主键的五种方式

    -- 在列上定义主键,Oracle自己起名
    create table user1(id number primary key, name varchar2(20));
    
    -- 在列上定义主键,自定义名字
    create table user2(id number constraint pk_user2 primary key, name varchar2(20));
    
    -- 在表上定义主键,Oracle自己起名
    create table user3(id number, name varchar2(20),primary key(id));
    
    -- 在表上定义主键,自定义名字
    create table user4(id number, name varchar2(20),constraint pk_id primary key(id));
    
    -- 先建表,再加主键
    create table user5(id number, name varchar2(20));
    alter table user5 add constraints pk_user5 primary key(id);
    

    4.综合实战演练

    建立2个表,一个是stuInfo(学号sno,姓名sname,年龄sage,性别smale,系编号deptNo),一个是department(系编号deptNo,系名称deptName)。
    要求:
    每个表有主键。
    stuInfo表建立外键。
    学生的姓名不能为空。
    学生的年龄要在18到50之间。
    学生的性别必须是男女之一,默认是男。
    stuInfo表的deptNo列,要参照department表的deptNo列。

    实现代码:

    -- stuInfo 创建
    create table stuInfo(
    sno number,
    sname varchar2(20) not null , -- 学生的姓名不能为空。
    sage number check(sage>18 and sage<50), -- 学生的年龄要在18到50之间。
    smale char(2) default '男' check(smale='男' or smale='女'),  -- 学生的性别必须是男女之一,默认是男。
    deptno varchar2(10),
    constraints pk_stuInfo primary key(sno)
    );
    
    -- department创建
    create table department(
    deptno varchar2(10),
    deptName varchar2(200),
    constraints pk_department primary key(deptno)
    );
    -- 创建外键
    alter table stuInfo add constraints fk_department foreign key(deptno) references department(deptno);
    
    
    

    5.删除约束

    语法:

    alter table 表名 drop constraint 约束名;
    

    如果删除一个主键被引用的表,则

    drop table 表名 cascade constraints;
    

    6.禁用约束

    -- 禁用主键约束
    alter table 表名 disable primary key;
    
    -- 启用主键约束
    alter table 表名 enable primary key;
    
  • 相关阅读:
    一文带你看清HTTP所有概念
    程序员不得不了解的硬核知识大全
    看完这篇HTTP,跟面试官扯皮就没问题了
    ReentrantLock 源码分析从入门到入土
    计算机网络的核心概念
    Kafka 的这些原理你知道吗
    2019 我是怎么熬过来的?
    不懂什么是锁?看看这篇你就明白了
    机器学习——方差、协方差与皮尔逊值
    最小生成树的本质是什么?Prim算法道破天机
  • 原文地址:https://www.cnblogs.com/OliverQin/p/12623461.html
Copyright © 2020-2023  润新知