• 数据库---约束


    一、概述

           创建表的时候可以给表中的数据添加数据校验规则,这些规则称之为约束。

    在创建表的时候,同时可以指定所插入数据的一些规则,比如某个字段不能为空值;

    某个字段的值(比如年龄)不能小于零等等。这些规则称为约束。

    约束是在表上强制执行的数据校验规则,它提供的自动保持数据库完整性的一种方法!

      创建约束的时机:

      ---在建表的同时创建

      ---建表之后通过alter进行创建

    二、约束类型

       从作用上分类,可以分成两大类:

      ---表级约束:可以约束表中任意一列或者多列。可以定义除了not null意外的任意约束

      ---列级约束:只能约束其所在的某一列,可以定义任何约束。

    1.主键约束(Primay Key Coustraint) 唯一性,非空性

    2.唯一约束 (Unique Counstraint)     唯一性,可以空,但只能有一个

    3.检查约束 (Check Counstraint)           对该列数据的范围、格式的限制(如:年龄、性别等)

    4.默认约束 (Default Counstraint)     该数据的默认值

    5.外键约束 (Foreign Key Counstraint)  需要建立两表间的关系并引用主表的列


    ORACLE数据库提供了下面五种完整性约束:

    1. 非空约束(not null)   插入数据的时候某些列不允许为空
    2. 唯一约束(unique key)  唯一键约束,可以限定某一个列的值是唯一的,唯一键的列一般被用作索引列。
    3. 主键约束(primary key) 非空且唯一,任何一张表一般情况下最好有主键,用来唯一的标识一行记录,
    4. 外键约束(foreign key)  当多个表之间有关联关系(一个表的某个列的值依赖与另一张表的某个值)的时候,需要使用外键
    5. 检查约束(check)     可以根据用户自己的需求去限定某些列的值

    三、主键约束(Primay Key Coustraint)

    主关键字约束指定表的一列或几列的组合的值在表中具有惟一性,即能惟一地指定一行记录。

    每个表中只能有一列被指定为主关键字,且IMAGE 和TEXT 类型的列不能被指定为主关键字,也不允许指定主关键字列有NULL 属性。

    *** 多列组成的主键叫联合主键,而且联合主键约束只能设定为表级约束;单列组成的主键,既可设定为列级约束,也可以设定为表级约束。

    联合主键:

    联合主键就是用2个或2个以上的字段组成主键。用这个主键包含的字段作为主键,这个组合在数据表中是唯一,且加了主键索引。

    -- 1.主键约束(Primay Key Coustraint)      唯一性,非空性
    ALTER TABLE student ADD CONSTRAINT PK_STU_ID PRIMARY KEY (stu_id);
    
    -- 插入两次一模一样的数据
    INSERT INTO student ( stu_id, name, age, hiredate, classes, email, deptno )
    VALUES( 20200707, 'zhansgan', 111, to_date( '2020-07-09', 'YYYY-MM-DD' ), '1', '12443@qq.com', 10 );

    四、唯一约束

    -- 2.唯一约束 (Unique Counstraint)     唯一性,可以空,但只能有一个
    ALTER TABLE student ADD CONSTRAINT PK_STU_EMAIL UNIQUE (email);
    -- 插入表中已存在的email数据
    INSERT INTO student ( stu_id, name, age, hiredate, classes, email, deptno )
    VALUES( 202007171806, 'lisi', 24, to_date( '2020-07-17', 'YYYY-MM-DD' ), '2', '12443@qq.com', 20 );

    五、检查约束 

    -- 3.检查约束 (Check Counstraint)        对该列数据的范围、格式的限制(如:年龄、性别等)
    -- 新增检查约束
    ALTER TABLE student ADD CONSTRAINT PK_STU_AGE CHECK (age > 0 AND age < 126);
    
    -- 测试
    INSERT INTO student ( stu_id, name, age, hiredate, classes, email, deptno )
    VALUES( 202007201103, 'han.sun', 130, to_date( '2020-07-17', 'YYYY-MM-DD' ), '2', 'sunhan@qq.com', 20 );
    
    -- 删除检查约束
    ALTER TABLE student DROP CONSTRAINT  PK_STU_AGE;

    六、默认约束

    -- 4.默认约束 (Default Counstraint)    该字段的默认值
    -- alter table 表名 modify (字段名 类型(占字节) default 默认值;
    ALTER TABLE STUDENT MODIFY (address VARCHAR2(100) DEFAULT '地址不详')
    -- 插入一条不带address的记录
    INSERT INTO student ( stu_id, name, age, hiredate, classes, email, deptno )
    VALUES( 07201147, 'han.sun12', 26, to_date( '2020-07-20', 'YYYY-MM-DD' ), '2', 'sunhan12@qq.com', 10 );
    SELECT * FROM STUDENT;

    七、外键约束

    -- 5.外键约束 (Foreign Key Counstraint)  需要建立两表间的关系并引用主表的列
    /*
    ALTER TABLE 表名 ADD CONSTRAINT 外键名称 
    FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);
    
    ALTER TABLE <数据表名> ADD CONSTRAINT <外键名>
    FOREIGN KEY(<列名>) REFERENCES <主表名> (<列名>);
    
    */
    ALTER TABLE STUDENT ADD CONSTRAINT PK_STU_DEPT_DEPTNO 
    FOREIGN KEY (DEPTNO) REFERENCES DEPT(DEPTNO) 
    
    -- -- 插入一条deptno不存在的记录
    INSERT INTO student ( stu_id, name, age, hiredate, classes, email, deptno )
    VALUES( 982385, 'han.sun12', 26, to_date( '2020-07-20', 'YYYY-MM-DD' ), '2', 'han.sun1@qq.com', 60 );

    如果需要撤销外键约束:

    -- MySQL撤销外键约束的语法
    ALTER TABLE STUDENT DROP FOREIGN KEY <外键约束名>
    
    -- Oracle撤销外键约束的语法
    ALTER TABLE STUDENT DROP CONSTRAINT <外键约束名>
  • 相关阅读:
    二、制作BOM表格--物料表格--Bill of Materials
    一、生成网络表--create Netlist
    Python使用OpenCV实现简单的人脸检测
    Spring编程式和声明式事务实例讲解
    可能是最漂亮的Spring事务管理详解
    关于Java IO与NIO知识都在这里
    Java IO,硬骨头也能变软
    Java NIO之拥抱Path和Files
    Java NIO之Selector(选择器)
    Java NIO 之 Channel(通道)
  • 原文地址:https://www.cnblogs.com/han-sun/p/13331757.html
Copyright © 2020-2023  润新知