zoukankan      html  css  js  c++  java
  • Oracle--约束

    约束

    约束是表一级的限制,是指在表上强制执行的数据校验规则。约束加在某一列

    1) 非空约束:   这一列必须赋值    NOT NULL  --非空

    2) 主键约束:   这一列的值必须唯一, 而且非空, 一张表只能有一个主键约束  PRIMARY KEY --主键

    3) 唯一约束:  这一列的值必须唯一,允许有一个null, 一张表可以多个唯一约束  UNIQUE KEY  --唯一键

    4) 检查约束: 限制值的范围,  性别只能是男或者女    check

    5) 默认值约束:  给某列添加一个默认值, 如果没有给这个列赋值, 这一列的值不是null,而是默认值    default

    6) 外键约束: A表某一列的数据必须来源与B表中某一列,  A表某一列的数据 必须在B表的某一列存在    FOREIGN KEY --外键

    创建约束两种方式:

    1. 在创建表的时候,就创建约束
    2. 在创建完表之后, 以修改表, 添加约束

    一、创建表的时候,就添加约束

    第一种写法:

    --创建一个 学生表  tb_stu 
    -- 学号     主键约束
    -- 姓名     非空约束
    -- 性别     非空约束   男or女(check约束) 
    -- 民族      默认值: "汉族"  说明不会出现null 不要加非空约束
    -- 身份证   非空约束   唯一
    -- 专业编号  必须来源专业表中的数据  外键约束
    CREATE TABLE tb_stu(
       stuNO CHAR(4)        PRIMARY KEY,   -- 主键约束
       sname VARCHAR2(20)   NOT NULL,      -- 非空约束
       sex   VARCHAR2(2)    DEFAULT '' CHECK(sex='' or sex=''),  --检查约束
       nation VARCHAR2(20)  DEFAULT '汉族', -- 默认值约束
       personCode  CHAR(18) UNIQUE-- 唯一约束
      -- sc_id char(2) REFERENCES t_school(sc_id) -- 外键约束(外键的表应该先创建)
    );

    第二种写法:  可以给 主键月色, 唯一约束检查约束, 外键约束 起一个名字

    /*规范:  主键:      pk_表名_列名
            唯一:      uk_表名_列名
            检查约束:   ck_表名_列名
            外键约束:   fk__表名_列名
    */
    /*
       声明好列之后, 添加约束(主键约束, 唯一约束检查约束, 外键约束),
       而非空约束,默认值这两个只能在声明列指定
       
       语法: 主键约束, 唯一约束检查
           CONSTRAINTS  约束名  约束类型(主键,唯一)(列名)
          
            检查约束
           CONSTRAINTS  约束名  check(列名的表达式)
            
            外键约束   A表的a列 引用 B表的b列,   A表叫从表,  B表:主表
           CONSTRAINTS  约束名  FOREIGN KEY(本表列名) REFERENCES 另外一张表名(另外一张表的列名)
    */

    例:

    CREATE TABLE tb_stu2(
       stuNO CHAR(4),
       sname VARCHAR2(20)  NOT NULL,  --非空约束
       sex   VARCHAR2(2)  DEFAULT '' ,
       nation VARCHAR2(20)  DEFAULT '汉族',
       personCode  CHAR(18),
       --添加约束
       CONSTRAINTS pk_stuNO PRIMARY KEY(stuNo),
       CONSTRAINTS ck_sex  CHECK(sex ='' or sex=''),
       CONSTRAINTS uk_personCode UNIQUE(personCode)
    );

    一张表不能有两个主键约束

    实际开发中, 一般会给表设置 一个id列(数据无意义的, 数字), 把id列设置为主键约束, 把这个id列叫做主键列

    CREATE TABLE tb_product(
       id  NUMBER PRIMARY KEY,
       name  VARCHAR2(100)  NOT NULL,
       price  NUMBER(9,2)  NOT NULL
    );

    联合主键约束, 组合主键

    CREATE TABLE  tb_score(
      stuNo  char(4),
      cNO    char(2),
      score  number(5,2)  check(score >=0 and score <= 100),
      CONSTRAINTS pk_stuNo_cNo primary key(stuNo,cNo)
    );

    外键约束: 

       添加数据, 先添加主表的数据,再添加从表的数据

       删除数据: 删除主表的数据, 如果这条记录被从表引用, 无法删除
       删除被引用的主表的这一条记录, 先删除 从表中的数据, 再删除主表

      互联网项目, 提高数据库效率, 一般不会设置外键约束, 外键约束由代码来维护

    从表的某一列引用主表的某一列

    /*
    外键约束   A表的a列 引用 B表的b列,   A表叫从表,  B表:主表
           CONSTRAINTS  约束名  FOREIGN KEY(本表列名) REFERENCES 另外一张表名(另外一张表的列名)     
    */
    -- 注意: 1) 创建表的时候, 先创建主表, 再创建从表
    --      2) 从表中引用主表某一列值的这一列要求数据类型与主表的列的数据类型一致
    --      3) 要求主表的被引用的列必须有主键约束或者唯一约束

    例:

    --专业表(主表)
    CREATE TABLE tb_major(
        majorId  number primary key,
        majorName varchar2(100)
    );-- 学生表(从表)  major  引入 tb_major 的majorId 
    --  要求 major 与majorId 数据类型一样
    CREATE TABLE tb_stu4(
       stuNO CHAR(4),
       sname VARCHAR2(20)  NOT NULL,  --非空约束
       sex   VARCHAR2(2)  DEFAULT '' ,
       nation VARCHAR2(20)  DEFAULT '汉族',
       personCode  CHAR(18),
       major  number  not null,                  --专业,引用专业表中列
       --添加约束
       CONSTRAINTS pk_stuNO PRIMARY KEY(stuNo),
       CONSTRAINTS ck_sex  CHECK(sex ='' or sex=''),
       CONSTRAINTS pk_personCode unique(personCode), 
       --添加外键列
       CONSTRAINTS FK_major_majorId FOREIGN KEY(major)  REFERENCES tb_major(majorId)
    );

    二:在创建完表之后, 以修改表, 添加约束

    修改表

    -- alter  table  表名      add constraints 约束名 约束类型
    alter table  t_student add constraints pk_t_student_stuNo  primary key(stuNo);
    insert into t_student(stuNo) values('1001');

    删除

    --删除约束
    -- alter table 表名   drop  constraints 约束名;
    alter table t_student drop constraints pk_t_student_stuNo;
    --如果表中有数据, 而且数据违反你将要添加的约束, 这个约束添加失败
    -- 数据为王, 数据最重要

    to_date()

    -- 把日期字符串转换为date
    select to_date('21/09/2017','dd/mm/yyyy') from dual
    
    -- 显示的oracle的默认的日期格式
  • 相关阅读:
    使用某些 DOCTYPE 时会导致 document.body.scrollTop 失效
    VB.NET 笔记1
    知识管理系统Data Solution研发日记之一 场景设计与需求列出
    知识管理系统Data Solution研发日记之五 网页下载,转换,导入
    折腾了这么多年的.NET开发,也只学会了这么几招 软件开发不是生活的全部,但是好的生活全靠它了
    分享制作精良的知识管理系统 博客园博客备份程序 Site Rebuild
    知识管理系统Data Solution研发日记之四 片段式数据解决方案
    知识管理系统Data Solution研发日记之二 应用程序系列
    知识管理系统Data Solution研发日记之七 源代码与解决方案
    知识管理系统Data Solution研发日记之三 文档解决方案
  • 原文地址:https://www.cnblogs.com/64Byte/p/12694206.html
Copyright © 2011-2022 走看看