SQL基础--完整性约束
完整性约束是保证用户所做的修改不会破坏数据的一致性,是保护数据正确性和相容性的一种手段。
常见的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基础--完整性约束的更多相关文章
- SQL基础--> 约束(CONSTRAINT)
--============================= --SQL基础--> 约束(CONSTRAINT) --============================= 一.几类数据完 ...
- (2.15)Mysql之SQL基础——开发设计最佳规范
(2.15)Mysql之SQL基础——开发设计最佳规范 关键字:mysql三大范式,mysql sql开发规范 分析: show profile.mysqllsla.mysqldrmpslow.exp ...
- 数据库整理(三) SQL基础
数据库整理(三) SQL基础 SQL语言的特点 集数据定义语言(DDL),数据操纵语言(DML),数据控制语言(DCL)功能于一体. 可以独立完成数据库生命周期中的全部活动: ●定义和修改.删除关 ...
- [SQL] SQL 基础知识梳理(一)- 数据库与 SQL
SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 目录 What's 数据库 ...
- [SQL] SQL 基础知识梳理(二) - 查询基础
SQL 基础知识梳理(二) - 查询基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 这是<SQL 基础知识梳理( ...
- [SQL] SQL 基础知识梳理(三) - 聚合和排序
SQL 基础知识梳理(三) - 聚合和排序 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5926689.html 序 这是<SQL 基础知识梳理 ...
- [SQL] SQL 基础知识梳理(四) - 数据更新
SQL 基础知识梳理(四) - 数据更新 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5929786.html 序 这是<SQL 基础知识梳理( ...
- [SQL] SQL 基础知识梳理(五) - 复杂查询
SQL 基础知识梳理(五) - 复杂查询 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5939796.html 序 这是<SQL 基础知识梳理( ...
- 黑马程序员+SQL基础(上)
黑马程序员+SQL基础 ---------------<a href="http://edu.csdn.net"target="blank">ASP ...
随机推荐
- Bootstrap《第一篇》,关于container、jumbotron、row、col、text-center等的学习
一.关于引入bootstrap文件 <!-- 为了确保适当的绘制和触屏缩放,需要在 <head> 之中添加 viewport 元数据标签. --> <meta name= ...
- 利用insert,update和delete注入获取数据
0x00 简介 利用SQL注入获取数据库数据,利用的方法可以大致分为联合查询.报错.布尔盲注以及延时注入,通常这些方法都是基于select查询语句中的SQL注射点来实现的.那么,当我们发现了一个基于i ...
- oracle从零开始学习笔记 二
多表查询 等值连接(Equijoin) select ename,empno,sal,emp.deptno from emp,dept where dept.deptno=emp.deptno; 非等 ...
- 从零开始的Android新项目1 - 架构搭建篇
记录一下新项目的搭建. 试想一下,如果没有历史负担,没有KPI压力,去新搭建一个项目,你会怎么设计和实现呢? 本系列文章不是教你怎么从0开始学Android,从0开始怎么建一个项目,而定位于零负担的情 ...
- 什么是core dump linux下用core和gdb查询出现"段错误"的地方
什么是core dump linux下用core和gdb查询出现"段错误"的地方 http://blog.chinaunix.net/uid-26833883-id-31932 ...
- MVC:从客户端中检测到有潜在危险的 Request.Form 值 的解决方法
从客户端(Content="<EM ><STRONG ><U >这是测试这...")中检测到有潜在危险的Request.Form 值. 说明: ...
- google bookmarket api
引用: 最近做了google书签同步的模块,发现google并没有公开bookmark相关的api接口,在网上也找了些资料,通过自己抓包分析,测试,总结下使用bookmark接口的心得,我是在andr ...
- Bug测试报告--在线考试系统--金州勇士
项目名:在线考试系统 组名:金州勇士 测试者:宫丽君(nice!团队) 代码地址: ssh:git@git.coding.net:handsomeman/examm.git https://g ...
- RCNN--对象检测的又一伟大跨越
最近在实验室和师兄师姐在做有关RCNN的研究,发现这里面坑很深呀,在网上找了一个大牛的博客,准备下来继追OPENCV同时,再来追一个RCNN的学习笔记的博文,博文地址如下:http://blog.cs ...
- PHP中fopen,file_get_contents,curl函数的区别
PHP中fopen,file_get_contents,curl函数的区别 1.fopen/file_get_contents每次请求都做DNS查询,并不对DNS的信息进行缓存,而curl会对DNS的 ...