完整性约束是保证用户所做的修改不会破坏数据的一致性,是保护数据正确性和相容性的一种手段。

常见的5种约束:

  NOT NULL            非空约束C     指定的列不允许为空值

UNIQUE               唯一约束U     指定的列中没有重复值,或该表中每一个值或者每一组值都将是唯一的

PRIMARY KEY          主键约束P     唯一的标识出表的每一行,且不允许空值,一个表只能有一个主键约束

FOREIGN KEY           外键约束R     一个表中的列引用了其它表中的列,使得存在依赖关系,可以指向引用自身的列

CHECK                     条件约束C     指定该列是否满足某个条件

非空约束 NK

  1. create table member(
  2. mid number,
  3. name varchar2(200) not null
  4. );

插入空报错:

  1. SQL> insert into member(mid,name) values(1,null);
  2. *
  3. 1 行出现错误:
  4. ORA-01400: 无法将 NULL 插入 ("SCOTT"."MEMBER"."NAME")

唯一约束 UK

  1. drop table member purge;
  2. create table member(
  3. mid number,
  4. name varchar2(200) not null,
  5. email varchar2(50) unique
  6. );

插入报错

  1. SQL> insert into member(mid,name,email) values (1,'scott','scott@163.com');
  2.  
  3. 已创建 1 行。
  4.  
  5. SQL> insert into member(mid,name,email) values (2,'jack','scott@163.com');
  6. insert into member(mid,name,email) values (2,'jack','scott@163.com')
  7. *
  8. 1 行出现错误:
  9. ORA-00001: 违反唯一约束条件 (SCOTT.SYS_C0010891)

给约束指定名字

这错误并没有像之前的非空约束那样,准确告诉用户哪个字段出现了问题,我们可以给这个约束指定一个名字

  1. create table member(
  2. mid number,
  3. name varchar2(200) not null,
  4. email varchar2(50),
  5. constraint uk_email unique(email)
  6. );

主键约束 PK

   主键约束=非空约束+唯一约束

  1. create table member(
  2. mid number,
  3. name varchar2(200) not null,
  4. email varchar2(50),
  5. constraint pk_number primary key(mid),
  6. constraint uk_email unique(email)
  7. );

插入错误的数据报错:

  1. SQL> insert into member(mid,name,email) values (1,'jack','scott@163.com');
  2.  
  3. 已创建 1 行。
  4.  
  5. SQL> insert into member(mid,name,email) values (1,'jack','jack@163.com');
  6. insert into member(mid,name,email) values (1,'jack','jack@163.com')
  7. *
  8. 1 行出现错误:
  9. ORA-00001: 违反唯一约束条件 (SCOTT.PK_NUMBER)

检查约束 CK

  1. create table member(
  2. mid number,
  3. name varchar2(200) not null,
  4. age number check(age between 0 and 200),
  5. sex varchar2(10),
  6. email varchar2(50),
  7. constraint pk_number primary key(mid),
  8. constraint uk_email unique(email),
  9. constraint ck_sex check(sex in('男','女'))
  10. );

插入错误数据报错:

  1. SQL> insert into member(mid,name,age,sex,email) values (1,'Jack','','无','jack@163.com');
  2. insert into member(mid,name,age,sex,email) values (1,'Jack','','无','jack@163.com')
  3. *
  4. 1 行出现错误:
  5. ORA-02290: 违反检查约束条件 (SCOTT.CK_SEX)

主外键约束  FK

  1. create table member(
  2. mid number,
  3. name varchar2(200) not null,
  4. constraint pk_mid primary key(mid)
  5. );
  6.  
  7. create table advice(
  8. adid number,
  9. content clob not null,
  10. mid number,
  11. constraint pk_adid primary key(adid),
  12. constraint fk_mid foreign key(mid) references member(mid)
  13. );

正确插入数据,mid在附表中已经存在

  1. insert into member(mid,name) values (1,'Scott');
  2. insert into member(mid,name) values (2,'Jack');
  3.  
  4. insert into advice(adid,content,mid) values (1,'test',1);
  5. insert into advice(adid,content,mid) values (2,'test',2);
  6. commit;

插入一条父表中没有的mid数据

  1. SQL> insert into advice(adid,content,mid) values (3,'test',3);
  2. insert into advice(adid,content,mid) values (3,'test',3)
  3. *
  4. 1 行出现错误:
  5. ORA-02291: 违反完整约束条件 (SCOTT.FK_MID) - 未找到父项关键字

采用主外键约束会在表的删除和数据删除方面存在新的问题

删除父表得先删除子表

  1. SQL> drop table member;
  2. drop table member
  3. *
  4. 1 行出现错误:
  5. ORA-02449: 表中的唯一/主键被外键引用

强制性删除父表,这样就不能使用purge选项了,并且字表中的主外键约束也将不复存在

  1. SQL> drop table member cascade constraint;
  2.  
  3. 表已删除。

SQL> insert into advice(adid,content,mid) values (3,'test',3);

已创建 1 行

  1.  

删除父表的数据的先删除字表中的数据

  1. SQL> delete from member where mid=1;
  2. delete from member where mid=1
  3. *
  4. 1 行出现错误:
  5. ORA-02292: 违反完整约束条件 (SCOTT.FK_MID) - 已找到子记录

除了这种方法外还可以设置级联操作子句

on delete cascade

  1. create table advice(
  2. adid number,
  3. content clob not null,
  4. mid number,
  5. constraint pk_adid primary key(adid),
  6. constraint fk_mid foreign key(mid) references member(mid) on delete cascade
  7. );

这样的话,删除附表数据,会把字表中的数据也给删除。

on delete set null

  1. create table advice(
  2. adid number,
  3. content clob not null,
  4. mid number,
  5. constraint pk_adid primary key(adid),
  6. constraint fk_mid foreign key(mid) references member(mid) on delete set null
  7. );

这样删除父表中的数据,子表中的对应的关联字段将被设置为空

  1. SQL> delete from member where mid=1;
  2.  
  3. 已删除 1 行。
  4.  
  5. SQL> select * from advice;
  6.  
  7. ADID CONTENT MID
  8. ---------- ---------- ----------
  9. 1     test
  10. 2     test 2

查看约束

  1. SQL> select constraint_name,constraint_type,table_name from user_constraints;
  2.  
  3. CONSTRAINT_NAME C   TABLE_NAME
  4. ------------------------------ - ------------------------------
  5. FK_DEPTNO R      EMP
  6. PK_EMP P      EMP
  7. PK_DEPT P      DEPT

R外键约束,C检查约束,Q唯一约束,P主键约束

修改约束

增加约束

  1. alter table member add constraint pk_mid primary key(mid);
  2. alter table member add constraint ck_age check(age between 0 and 200);
  3. alter table member modify (name varchar2(50) not null);

需要注意的是非空约束使用的是modify的方式

禁用/启用约束

非外键

  1. alter table member disable constraint ck_age;
    alter table member enable constraint ck_age;

外键

  1. alter table member disable constraint pk_mid cascade;

删除约束

  1. alter table member drop constraint pk_mid cascade;
  2. alter table member drop constraint ck_age;

SQL基础--完整性约束的更多相关文章

  1. SQL基础--> 约束(CONSTRAINT)

    --============================= --SQL基础--> 约束(CONSTRAINT) --============================= 一.几类数据完 ...

  2. (2.15)Mysql之SQL基础——开发设计最佳规范

    (2.15)Mysql之SQL基础——开发设计最佳规范 关键字:mysql三大范式,mysql sql开发规范 分析: show profile.mysqllsla.mysqldrmpslow.exp ...

  3. 数据库整理(三) SQL基础

    数据库整理(三) SQL基础 SQL语言的特点 集数据定义语言(DDL),数据操纵语言(DML),数据控制语言(DCL)功能于一体. 可以独立完成数据库生命周期中的全部活动: ​ ●定义和修改.删除关 ...

  4. [SQL] SQL 基础知识梳理(一)- 数据库与 SQL

    SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 目录 What's 数据库 ...

  5. [SQL] SQL 基础知识梳理(二) - 查询基础

    SQL 基础知识梳理(二) - 查询基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 这是<SQL 基础知识梳理( ...

  6. [SQL] SQL 基础知识梳理(三) - 聚合和排序

    SQL 基础知识梳理(三) - 聚合和排序 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5926689.html 序 这是<SQL 基础知识梳理 ...

  7. [SQL] SQL 基础知识梳理(四) - 数据更新

    SQL 基础知识梳理(四) - 数据更新 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5929786.html 序 这是<SQL 基础知识梳理( ...

  8. [SQL] SQL 基础知识梳理(五) - 复杂查询

    SQL 基础知识梳理(五) - 复杂查询 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5939796.html 序 这是<SQL 基础知识梳理( ...

  9. 黑马程序员+SQL基础(上)

    黑马程序员+SQL基础 ---------------<a href="http://edu.csdn.net"target="blank">ASP ...

随机推荐

  1. 往sde中导入要素类报错000732

    sde可以成功连接,可以在Server中注册. 但是向sde中导入要素类报错000732,如图所示. 点击红色圆圈提示 ERROR 000732. 将路径修改为绝对路径即可,如下图所示.

  2. Bootstrap《第一篇》,关于container、jumbotron、row、col、text-center等的学习

    一.关于引入bootstrap文件 <!-- 为了确保适当的绘制和触屏缩放,需要在 <head> 之中添加 viewport 元数据标签. --> <meta name= ...

  3. 基于Spark1.3.0的Spark sql三个核心部分

    基于Spark1.3.0的Spark sql三个核心部分: 1.可以架子啊各种结构化数据源(JSON,Hive,and Parquet) 2.可以让你通过SQL,saprk内部程序或者外部攻击,通过标 ...

  4. ElasticSearch集群未连接 无法发现节点(windows环境)以及windows环境下设置服务 不能自动启动的问题

    1.无法发现节点的错误: 试验了很多情况,但是总是无法加入集群,后来尝试了一下步骤,问题解决: 1.删除所有数据,重启:无效: 2.统一配置,全部重启,无效: 3.关闭所有防火墙,全部重启,无效: … ...

  5. resx文件在X64位编译,提示“未能加载文件或程序集”的问题?

    原文:resx文件在X64位编译,提示"未能加载文件或程序集"的问题? resx文件在X64位编译,提示"未能加载文件或程序集"的问题? 解答: 错误现象如下 ...

  6. Avada主题通过自定义CSS全局更换微软雅黑字体

    Avada主题的菜单.正文.标题.面包屑路径等等如果想更换为“微软雅黑”中文字体,只需要进入Avada主题的选项,倒数第二项有个Custom CSS,把下面的代码粘贴进去即可.当然你也可以自行改变字体 ...

  7. 在CentOS 6.6下安装与配置mysql

    1.使用yum安装mysql yum list | grep mysql   //查看mysql信息 yum install mysql-server.x86_64 //安装mysql sudo ap ...

  8. PL/SQL 存储函数和过程

    --存储过程 .不带参: create or replace procedure 存储过程名 as|is --说明部分 begin --执行的语句: end: 调用存储过程 execute 存储过程名 ...

  9. HTTP协议上传boundary确定&下载content-disposition理解

    HTTP协议上传文件-协议 上传文件需要将form标签 的 ENCTYPE 属性设置为 multipart/form-data属性, 与 application/x-www-form-urlencod ...

  10. Winform 进程、线程、treeview

    进程:一个程序就是一个进程,但是也有一个程序需要多个进程来支持的情况 进程要使用的类是:Process它在命名空间:System.Diagnostics; 静态方法Start();也可以实例化对象,来 ...