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

常见的5种约束:

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

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

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

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

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

非空约束 NK

create table member(
mid number,
name varchar2(200) not null
);

插入空报错:

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

唯一约束 UK

drop table member purge;
create table member(
mid number,
name varchar2(200) not null,
email varchar2(50) unique
);

插入报错

SQL> insert into member(mid,name,email) values (1,'scott','scott@163.com');

已创建 1 行。

SQL> insert into member(mid,name,email) values (2,'jack','scott@163.com');
insert into member(mid,name,email) values (2,'jack','scott@163.com')
*
第 1 行出现错误:
ORA-00001: 违反唯一约束条件 (SCOTT.SYS_C0010891)

给约束指定名字

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

create table member(
mid number,
name varchar2(200) not null,
email varchar2(50),
constraint uk_email unique(email)
);

主键约束 PK

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

create table member(
mid number,
name varchar2(200) not null,
email varchar2(50),
constraint pk_number primary key(mid),
constraint uk_email unique(email)
);

插入错误的数据报错:

SQL> insert into member(mid,name,email) values (1,'jack','scott@163.com');

已创建 1 行。

SQL> insert into member(mid,name,email) values (1,'jack','jack@163.com');
insert into member(mid,name,email) values (1,'jack','jack@163.com')
*
第 1 行出现错误:
ORA-00001: 违反唯一约束条件 (SCOTT.PK_NUMBER)

检查约束 CK

create table member(
mid number,
name varchar2(200) not null,
age number check(age between 0 and 200),
sex varchar2(10),
email varchar2(50),
constraint pk_number primary key(mid),
constraint uk_email unique(email),
constraint ck_sex check(sex in('男','女'))
);

插入错误数据报错:

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

主外键约束  FK

create table member(
mid number,
name varchar2(200) not null,
constraint pk_mid primary key(mid)
); create table advice(
adid number,
content clob not null,
mid number,
constraint pk_adid primary key(adid),
constraint fk_mid foreign key(mid) references member(mid)
);

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

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

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

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

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

删除父表得先删除子表

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

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

SQL> drop table member cascade constraint;

表已删除。

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

已创建 1 行

 

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

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

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

on delete cascade

create table advice(
adid number,
content clob not null,
mid number,
constraint pk_adid primary key(adid),
constraint fk_mid foreign key(mid) references member(mid) on delete cascade
);

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

on delete set null

create table advice(
adid number,
content clob not null,
mid number,
constraint pk_adid primary key(adid),
constraint fk_mid foreign key(mid) references member(mid) on delete set null
);

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

SQL> delete from member where mid=1;

已删除 1 行。

SQL> select * from advice;

      ADID CONTENT         MID
---------- ---------- ----------
1     test
2     test 2

查看约束

SQL>  select constraint_name,constraint_type,table_name  from user_constraints; 

CONSTRAINT_NAME            C   TABLE_NAME
------------------------------ - ------------------------------
FK_DEPTNO R      EMP
PK_EMP P      EMP
PK_DEPT P      DEPT

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

修改约束

增加约束

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

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

禁用/启用约束

非外键

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

外键

alter table member disable constraint pk_mid cascade;

删除约束

alter table member drop constraint pk_mid cascade;
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. WPF 关于窗口的一些显示效果

    0. 一些常用尺寸大小: 1920x1080; 1600x900; 1280x720; 1024x576; 1. 设置窗口的边框样式 使用 Window.WindowStyle 属性可以设置窗口的边框 ...

  2. 遍历echsop的region表形成缓存的程序

    header("Content-type: text/html; charset=utf-8"); $con = mysql_connect("localhost&quo ...

  3. Construct Binary Tree from Inorder and Postorder Traversal || LeetCode

    /** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * s ...

  4. 浏览器同步测试神器 — BrowserSync

    Browsersync 能让浏览器实时.快速响应文件更改(html.js.css.sass.less等)并自动刷新页面.更重要的是 Browsersync可以同时在PC.平板.手机等设备下进项调试,当 ...

  5. Altium Designer的PCB定位槽制作

    Altium Designer的PCB定位槽制作 1.使用焊盘代替. 操作很简单,但孔壁有镀铜. 2.定位孔制作. 先在Keep-Out layer放置一个需要大小的圆, 然后按快捷键T-V-T,这时 ...

  6. tomcat的maxThreads、acceptCount(最大线程数、最大排队数)

    转载:http://blog.sina.com.cn/s/blog_605f5b4f01012ljj.html tomcat 的Connector配置如下 <Connector port=&qu ...

  7. Java接口与实例化

    看代码看到 public Runnable r = new Runnable() { @Override public void run() { ... } } 接口不能new ,不过可以生成一个匿名 ...

  8. git如何使用 svn如何使用

    git和svn是2款常用的版本控制系统. git 的功能: 1.从服务器上克隆完整的Git仓库(包括代码和版本信息)到单机上. 也就是说自己机器上有一个git仓库. 这和svn是不同的,svn是没有本 ...

  9. echarts入门基础,画柱型图

    注意:一定要自己引入echarts库 <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...

  10. WEB语言转义总结

    后台字符串嵌入前台语言输出   web语言分为后台和前台,如果后台语言嵌入方式将字符串输出到前台语言中,需要按照前台语言的要求进行转义. 因为前台各个语言都有自身的保留字符, 用于规定自身的语法格式, ...