Oracle基础(八) 数据完整性
一、数据完整性
数据完整性要求数据库中的数据具有准确性。准确性是通过数据库表的设计和约束来实现的。为了实现数据完整性,数据库需要做两方面的工作:
- 确保每行的数据符合要求。
- 确保每列的数据符合要求。
为了实现以上要求,Oracle提供了一下4种类型的约束(Constraint)。
1、实体完整性约束
实体完整性要求表中的每一行数据都反映不同的实体,不能存在相同的数据行。通过主键约束,唯一约束来实现实体完整性。
(1)主键约束:
表中的一列或者纪略组合的值能用来唯一的表示表中的每一行,这样的一列或者多列的组合叫做表的主键。
主键自带唯一性,并且不能为空,一个表只能有一个主键,主键确保了表中数据行的唯一,同一张表中,可以使用多个列共同作为主键。在选择主键时,应遵循两个原则,最少性和稳定性。
(2)唯一约束:
保证数据行中的某一列的数据是唯一的,不重复的。这样可以添加唯一约束。
唯一约束和主键的区别:
- 主键不能为空,唯一可以为空,但只允许有一个空值。
- 主键一张表中只有一个,而唯一可以有多个。
- 主键可以由多个表来组成,唯一只能是单列。
- 主键可以作为其他表的外键,唯一不可以。
2、域完整性:
与完整性是指给定咧的输入的有效性。通过数据类型、检查约束、输入格式、外键约束、默认值、非空约束等方法来实现。
3、引用完整性:
引用完整性是指为两个表中存在一定的联系,从而保证数据的完整性。例如:班级和学生,学生所在班级一定是在班级表中所存在的,不然就会出现不准确。引用完整性我们可以通过外键约束来实现。
4、自定义完整性:
用户自己定义约束规则。主要通过存储过程和触发器对象来实现。
二、添加约束
在创建表时,我们可以再字段后添加各种约束。这里分为列级定义和表级定义:
1、列级定义
列级定义是指在定义列的同时定义定义约束。
如在t_class表定义主键和唯一约束
--创建班级表
CREATE TABLE t_class
(
cid NUMBER CONSTRAINT pk_cid PRIMARY KEY, --为cid添加主键约束
cname VARCHAR2(20) constraint uq_sortname UNIQUE --为cname添加唯一约束
)
说明:在列级定义时,加不加constraint pk_department都是可以的,区别是不加的话,系统会自动分配一个主键约束名称,可读性差。
2、表级定义
表级定义是指在定义了所有列后,再定义约束。需要注意:not null只能在列级上定义。
以在建立学生和班级表时定义主键约束和外键约束为例:
--创建学生表
create table t_student(
stuID number(4),
stuname varchar2(20) NOT NULL,
stupass varchar2(20) NOT NULL,
cid NUMBER NOT NULL,
constraint uq_username UNIQUE(stuname), --创建唯一约束
constraint ck_userpass Check(LENGTH(stupass) > 3), --创建检查约束(密码长度大于3位)
constraint pk_uid primary key(stuID), --主键约束
constraint fk_cid foreign key(cid) references t_class(cid) --外键约束
);
3、创建表后,我们也可以在已经建好的表上添加约束,需要使用ALTER TABLE语句。
语法:ALTER TABLE ADD CONSTRAINT 约束名 约束类型 具体的约束说明。
ALTER TABLE t_student
ADD CONSTRAINT uq_username UNIQUE(stuname) --创建唯一约束
ADD CONSTRAINT ck_userpass Check(LENGTH(stupass) > 3) --创建检查约束(密码长度大于3位)
ADD CONSTRAINT pk_uid primary key(stuID) --主键约束
ADD CONSTRAINT fk_cid foreign key(cid) references t_class(cid) --外键约束
默认值约束:
alter table 表名 modify 列名 default 默认值;
--语法:
ALTER TABLE tb_student
MODIFY stubirthday DEFAULT SYSDATE --将生日默认值设为当前系统时间
三、删除约束
语法:ALTER TABLE DROPCONSTRAINT 约束名
ALTER TABLE t_student
DROP CONSTRAINT PK_UID
四、查看约束
查看T_STUDENT表中所有的约束。注意:这里的表明必须全大写否则查不到结果。
SELECT * FROM USER_CONSTRAINTS
WHERE table_name = 'T_STUDENT'
Oracle基础(八) 数据完整性的更多相关文章
- Oracle基础学习笔记
Oracle基础学习笔记 最近找到一份实习工作,有点头疼的是,有阶段性考核,这...,实际想想看,大学期间只学过数据库原理,并没有针对某一数据库管理系统而系统的学习,这正好是一个机会,于是乎用了三天时 ...
- Oracle基础知识汇总一
Oracle基础知识 以下内容为本人的学习笔记,如需要转载,请声明原文链接 https://www.cnblogs.com/lyh1024/p/16720759.html oracle工具: SQ ...
- Bootstrap <基础八>图片
Bootstrap 提供了三个可对图片应用简单样式的 class: .img-rounded:添加 border-radius:6px 来获得图片圆角. .img-circle:添加 border-r ...
- oracle基础教程(8)oracle修改字符集
oracle基础教程(8)oracle修改字符集 1.用dba连接数据库 -->sqlplus / as sysdba 2.查看字符集 -->SELECT parameter, value ...
- Java语言基础(八)
Java语言基础(八) 一.数学运算 + - * / % (1)凡是byte short char类型都按int类型的计算 看看上面的代码,为什么出错! 我已经将100转成byte类型,( ...
- 图说Oracle基础知识(一)
本文主要对Oralce数据库操作的基础知识进行一下梳理,以便进行归纳总结.适用于未使用过Oracle数据库的读者,或需要学习Oracle数据库方面的基础知识.如有不足之处,还请指正. 关于SQL介绍的 ...
- {Django基础八之cookie和session}一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session
Django基础八之cookie和session 本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 xxx 七 ...
- Java基础八--构造函数
Java基础八--构造函数 一.子父类中构造函数的特点 1.1 为什么在子类构造对象时,发现,访问子类构造函数时,父类也运行了呢? 原因是:在子类的构造函数中第一行有一个默认的隐式语句. super( ...
- oracle基础教程oracle客户端详解
oracle基础教程oracle客户端工具详解 参考网址:http://www.oraclejsq.com/article/010100114.html 该教程介绍了oracle自带客户端sqlplu ...
- Oracle基础 表分区
Oracle基础 表分区 一.表分区 (一)表分区的分类 1.范围分区(range) 2.散列分区(hash) 3.列表分区(list) 4.复合分区:范围-哈希(range-hash).范围-列表( ...
随机推荐
- HIT 2275 Number sequence
点击打开HIT 2275 思路: 树状数组 分析: 1 题目要求的是总共的搭配方式,满足Ai < Aj > Ak.并且i j k不同 2 我们开两个树状数组,第一个在输入的时候就去更新.然 ...
- HDU 1520Anniversary party(树型DP)
HDU 1520 Anniversary party 题目是说有N个人参加party,每个人有一个rating值(可以理解为权值)和一个up(上司的编号),为了保证party的趣味性,每一个人不可 ...
- 深入理解CRITICAL_SECTION
临界区是一种防止多个线程同时执行一个特定代码节的机制,这一主题并没有引起太多关注,因而人们未能对其深刻理解.在需要跟踪代码中的多线程处理的性能时,对 Windows 中临界区的深刻理解非常有用.本文深 ...
- 第一章TP-Link 703N刷OpenWrt
1)下载编译好的固件 openwrt-ar71xx-generic-tl-wr703n-v1-squashfs-factory.bin openwrt-ar71xx-generic-tl-wr703n ...
- 面向过程MySQL数据库链接操作
刚好今天复习到这个章节,将就发布出来,就当是为自己复习了 //链接数据库 $link = mysqli_connect('localhost/IP地址','用户名','密码','数据库名'); //设 ...
- Ext.grid.Panel 数据动态改变后刷新grid
gridPanel中加载的数据分为两种:一种是本地数据加载,那另一种就是后台数据加载. 在表格中增.删.改.查 是必不可少的. 那么数据动态改变后怎样刷新表格中的数据呢. 一.后台取数据 var gr ...
- 解决Unable to connect to a repository at URL 禁止访问 (forbidden)
连接SVN报如下错误. Unable to connect to a repository at URL 禁止访问 (forbidden) 1. 右键点击本地副本,TortoiseSV ...
- 怎样解决VirtrualBox不能新建64bit的系统的问题
假设你的VirtrualBox不能新建64bit的虚拟机一般有以下两个原因: 1.电脑是32位的,不支持创建64bit的虚拟机 2.电脑不支持Intel VT-x,或者是Intel VT-x没有打开 ...
- Cocos2D-x权威指南:通过节点控制屏幕中的全体渲染对象
本节,已经能够利用我们眼下所学的知识做出一些有趣的东西.之前已经说过,CCNode类没有贴图,也就是说在屏幕上单独建立一个节点是没有不论什么效果的,可是能够通过这个"无形"的节点来 ...
- Codeforces Round #339 (Div. 2) A. Link/Cut Tree 水题
A. Link/Cut Tree 题目连接: http://www.codeforces.com/contest/614/problem/A Description Programmer Rostis ...