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 ...
随机推荐
- Flink -- Barrier
CheckpointBarrierHandler 这个接口用于react从input channel过来的checkpoint barrier,这里可以通过不同的实现来,决定是简单的track bar ...
- Java基础之扩展GUI——添加状态栏(Sketcher 1 with a status bar)
控制台程序. 为了显示各个应用程序参数的状态,并且将各个参数显示在各自的面板中,在应用程序窗口的底部添加状态栏是常见且非常方便的方式. 定义状态栏时没有Swing类可用,所以必须自己建立StatusB ...
- 【群论】polya定理
对Polya定理的个人认识 我们先来看一道经典题目: He's Circles(SGU 294) 有一个长度为N的环,上面写着“X”和“E”,问本质不同的环有多少个(不 ...
- Events in ASP.NET Master and Content Pages
Content page PreInit event. Master page controls Init event. Content controls Init event. Master pag ...
- iOS中Block的基础用法
本文简介 本章不会对Block做过多的实现研究.只是讲解基本的用法.纯粹基础知识.结合实际项目怎么去做举例.Block使用场景,可以在两个界面的传值,也可以对代码封装作为参数的传递等.用过GCD就知道 ...
- html+css创建提示框
看到下面的效果了吗? 本来我们站点是用下面的图片做的背景, 但是后期当更改完框中的提示内容,并且更新内容较多的时候,发现内容溢出了,如下图: 但是背景图片不能自动拉伸,还得重新做一张背景图,这样就导致 ...
- 20145227&20145201 《信息安全系统设计基础》实验一 开发环境的熟悉
北京电子科技学院(BESTI) 实 验 报 告 课程:信息安全系统设计基础 班级:1452 姓名:李子璇 鄢曼君 学号:20145201 20145227 成绩: 指导教师:娄嘉鹏 实验日期:2016 ...
- jquery easyui 解析数据库返回的数据
- ALLOCATE语句分配FORTRAN动态数组方法(转自http://blog.csdn.net/zhuxianjianqi/article/details/8067174)
数组的动态分配 a) 可分配数组 数组可以是静态的也可以是动态的.如果数组是静态的,则在编译时就被分配了固定的储存空间,并且直到程序退出时才被释放.程序运行时静态数组的大小不能改变.静态数组的缺 ...
- js页面刷新之实现定时刷新(定时器,meta)
测试页面的代码见上一篇博客 接下来进入正题-定时不断刷新页面的方法: 1.看到定时,很容易想到js的定时器: //第一种方法 //由于我们已经有了一个定时器,所以只要在定时器test中加入一句刷新页面 ...