zoukankan      html  css  js  c++  java
  • 数据库中的约束

    约束的种类

    • 主键约束   primary key

    这个字段的值必须满足非空且该字段的值不能重复

    一张表中只能有一个主键

    • 唯一性约束   unique

    这个字段的值不能重复

    一张表中的唯一性约束个数不受限制

    不能检查NULL值

    • 非空约束    not null

    这个字段的值不能是NULL值

    一张表中的非空约束个数不受限

    • 检查约束    check(条件)

    字段的值必须符合检查条件(条件由自己指定,where里写的这里都可以写)

    • 外键约束    references(参考/ 关联/ 引用)   

    建立两张表的关联关系

              foreign key(外键)   指定字段

    on  delete  cascade      级联删除

    on delete  set  nill   级联置空

     约束的实现

    • 列级约束

    在建立表时,直接在表的某一列之后加约束限制

    • 表级约束

    在建立(定义)完表的所有列之后,再选择某些列加约束限制

     主键的列级约束实现

    create table testcolumn_cons(id primary key, name varchar2(30));

     

    insert into testcolumn_cons values(1, 'test1');

    出错:00001,唯一性错误

    如果不给约束起名字,则系统会自动为约束建立一个唯一的名字(但该名字比较难以理解)

    如何给约束起名字(出错判断时,知道是哪一个出错了)

    constraint(关键字)  约束名(表名_加约束的字段名_约束类型)
    
    create table testcolumn_cons(id number constraint testcolumn_cons_idpl primary key, name varchar2(30));

     

    这样出错时就知道是哪里出了错(起名要有规律)

    主键的列级约束

    演示:

    • 建立一张表,建立之前先删表
    • 这张表有id  number是主键    
    • fname  varchar2(30)   要求非空   
    • sname varchar2(30)  要求唯一
    • 要求给约束起名字

      

    drop table testcolunm_cons;

     

    create table testcolumn_cons(
      id number constraint testcolumn_cons_id_pk primary key,
      fname varchar2(30) constraint testcolumn_cons_fname_nn not null,
      sname varchar2(30) constraint testcolumn_cons_sname_un unique
    );

      

      查看:

    desc table testcolumn_cons;

    增加检查约束:salary  number 检查条件:要求工资大于3500。

     

    create table testcolumn_cons(id number constraint testcolumn_cons_id_pk primary key,
      fname varchar2(30) constraint testcolumn_cons_fname_nn not null,
      sname varchar2(30) constraint testcolumn_cons_sname_un unique,
      salary number constraint testcolumn_cons_salary_ck check(salary>3500)
    );

      检测一下: 

    insert into testcolumn_cons values(1, 'a', 'b', 3499);

      

    主键的表级约束

    • 在约束关键字后面(要约束的字段名),非空不让有表级约束。
    • 定义完所有的字段和类型后,加“,”再加上表级约束。

    演示:

    • 建立一张表  建立之前先删表
    • 这张表有id  number 是主键
    • fname varchar2(30)
    • sname varchar2(30)   要求唯一
    • salary number  要求工资大于3500
    • 要求给约束起名字
    • 增加约束,检查约束
    create table testtable_cons(
      id number,
      fname varchar2(30),
      sname varchar2(30),
      salary number,
      constraint testtable_cons_id_pk primary key(id),
      constraint testtable_cons_sname_un unique(sname),
      constraint testtable_cons_salary_ck check(salary>3500),
    );

    not null  没有表级约束  

    联合约束

    在表级约束时,指定约束的字段时,可以约束多个字段

    没有“联合非空”的说法,所以非空没有表级约束

    演示:拿上面的例子再做一次,把id和fname绑成一个主键——联合主键(理论绑多个)                                                                                                     

    把id和fname联合起来非空且唯一

    这样是只有一个主键的!id+fname是主键

    id    fname

    1     a

    1     b

    1     NULL

    都可以,id重复了也没关系,因为主键是联合的;

    fname是NULL也没关系,联合的不为空就行。

     

    create table testtable_cons(
          id number,
      fname varchar2(30),
      sname varchar2(30),
      salary number,
      constraint testtable_cons_id_pk primary key(id),
      constraint testtable_cons_sname_un unique(sname),
      constraint testtable_cons_salary_ck check(salary>3500),
    );

    表级约束  vs  列级约束

    • 表级约束:可以做联合约束
    • 列级约束:书写简单直观,无法完成联合约束

    实际应用中混着用

    唯一性(unique)只能区分非空值,不可以区分空值(NULL)

    两个或多个NULL无法区分唯一性,实际中可以再设一个非空就可以了 

  • 相关阅读:
    React教程(一) React介绍与搭建
    微信公众号订阅号以及服务号通过网页授权获取用户openid方法
    AES,DES加密JS源文件及其使用方法
    R 分类进行数值处理
    C++ const 关键字总结
    软工lintcode作业
    [恶意软件分析]DroidBox的环境搭建与使用
    Android第三次作业
    Android第二次作业
    android 第一次作业
  • 原文地址:https://www.cnblogs.com/cjaaron/p/9216459.html
Copyright © 2011-2022 走看看