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 ...
随机推荐
- 往sde中导入要素类报错000732
sde可以成功连接,可以在Server中注册. 但是向sde中导入要素类报错000732,如图所示. 点击红色圆圈提示 ERROR 000732. 将路径修改为绝对路径即可,如下图所示.
- Bootstrap《第一篇》,关于container、jumbotron、row、col、text-center等的学习
一.关于引入bootstrap文件 <!-- 为了确保适当的绘制和触屏缩放,需要在 <head> 之中添加 viewport 元数据标签. --> <meta name= ...
- 基于Spark1.3.0的Spark sql三个核心部分
基于Spark1.3.0的Spark sql三个核心部分: 1.可以架子啊各种结构化数据源(JSON,Hive,and Parquet) 2.可以让你通过SQL,saprk内部程序或者外部攻击,通过标 ...
- ElasticSearch集群未连接 无法发现节点(windows环境)以及windows环境下设置服务 不能自动启动的问题
1.无法发现节点的错误: 试验了很多情况,但是总是无法加入集群,后来尝试了一下步骤,问题解决: 1.删除所有数据,重启:无效: 2.统一配置,全部重启,无效: 3.关闭所有防火墙,全部重启,无效: … ...
- resx文件在X64位编译,提示“未能加载文件或程序集”的问题?
原文:resx文件在X64位编译,提示"未能加载文件或程序集"的问题? resx文件在X64位编译,提示"未能加载文件或程序集"的问题? 解答: 错误现象如下 ...
- Avada主题通过自定义CSS全局更换微软雅黑字体
Avada主题的菜单.正文.标题.面包屑路径等等如果想更换为“微软雅黑”中文字体,只需要进入Avada主题的选项,倒数第二项有个Custom CSS,把下面的代码粘贴进去即可.当然你也可以自行改变字体 ...
- 在CentOS 6.6下安装与配置mysql
1.使用yum安装mysql yum list | grep mysql //查看mysql信息 yum install mysql-server.x86_64 //安装mysql sudo ap ...
- PL/SQL 存储函数和过程
--存储过程 .不带参: create or replace procedure 存储过程名 as|is --说明部分 begin --执行的语句: end: 调用存储过程 execute 存储过程名 ...
- HTTP协议上传boundary确定&下载content-disposition理解
HTTP协议上传文件-协议 上传文件需要将form标签 的 ENCTYPE 属性设置为 multipart/form-data属性, 与 application/x-www-form-urlencod ...
- Winform 进程、线程、treeview
进程:一个程序就是一个进程,但是也有一个程序需要多个进程来支持的情况 进程要使用的类是:Process它在命名空间:System.Diagnostics; 静态方法Start();也可以实例化对象,来 ...