概要图

一 约束

--问题:往表中插入数据的时候,可能出现一些问题,比如:重复插入数据,内容不对(性别)

--如何保证数据库表中数据的完整性和一致性呢?

约束是强加在表上的规则或条件,确保数据库满足业务规则,保证数据的完整性。

约束又分为列约束(Column Constraint)和表约束(Table Constraint)。列约束作为列定义的一部分只作用于此列本身。表约束作为表定义的一部分,可以作用于多个列

--常见的约束:主键(primary key),外键(foreign key),唯一(unique),非空(not null),默认(default),用户自定义(check)

1.1 主键约束

--什么是主键约束?主键约束就是给表定义一个主键,什么是主键?

--主键主要是用来保证表记录的唯一非空的。

--建表的时候添加主键

create table student(stuno number(4) primary key,stuname varchar2(10),age number(2),addr varchar(50));

insert into student values(1001,'zhang',18,'luoyang');

--再次插入相同记录,违法主键约束,不允许插入

SQL> insert into student values(1001,'zhang',18,'luoyang');

insert into student values(1001,'zhang',18,'luoyang')

ORA-00001: 违反唯一约束条件 (SYS.SYS_C0010797)

--如果主键为null也不允许插入,同样是违反了主键约束

SQL> insert into student values(null,'zhang',18,'luoyang');

insert into student values(null,'zhang',18,'luoyang')

--第一种
create table student2(
stuno number() primary key,
stuname varchar2(),
age number(),
addr varchar()
)
--第二种
create table student2(
stuno number() constraints pk_stuno primary key,
stuname varchar2(),
age number(),
addr varchar()
)
--第三种
create table student (
stuno number(),
stuname varchar2(),
age number(),
addr varchar(),
constraints pk_stuo primary key(stuno)
);

--创建一张课程表:

create table course(cno number(4) primary key,cname varchar2(20),cscore number(2));

--创建一张成绩表:学号和课程号共同作为一个主键,称为联合主键

--一张表只能有一个主键

create table score(sno number(4),cno number(4),score number(5,2),constraint pk_score primary key (sno,cno));

drop table course;

create table course(cno number(4) constraint pk_course primary key ,cname varchar2(20),cscore number(2));

作业:

  1. 删除表空间时,如何删除相关联的数据文件

drop tablespace test_data including contents and datafiles;

1.2 非空约束(not null)

非空(NOT NULL)约束:顾名思义,所约束的列不能为NULL值。否则就会报错 。

举例:

create table user1(id number,name varchar2(30) not null);

insert into user1 values(001,'');//会报错

1.3 唯一约束(unique)

唯一(UNIQUE)约束:在表中每一行中所定义的这列或这些列的值都不能相同。必须保证唯一性。否则就会违反约束条件。

用于指定列的值不能重复,但可以为null。

CONSTRAINT constraint_name UNIQUE (col_name1[, col_name2,…])

举例:

create table user3(id number unique,name varchar2(30));

insert into user3 values(1,'111');

insert into user3 values(1,'111');//报错,唯一性

insert into user3 values(null,111);

例子

--创建唯一约束的三种方法
--(1)
create table student(
sno number() primary key,
sname varchar2() not null,
age number(),
addr varchar2(),
idcard number(18) unique);
--(2)c
create table student(
sno number() primary key,
sname varchar2() not null,
age number(),
addr varchar2(),
idcard number(18) constraint uk_idcard unique); --(3)
create table student(
sno number() primary key,
sname varchar2() not null,
age number(),
addr varchar2(),
idcard number(18),constraint uk_idcard unique(idcard));

primary key与unique的区别:

1.一张表可以有多个unique(唯一)约束;

2.一张表只能有一个主键;

3.设置为主键的列不能有null值;

1.4 非空约束(not null)

非空(NOT NULL)约束:顾名思义,所约束的列不能为NULL值。否则就会报错 。

举例:

create table user1(id number,name varchar2(30) not null);

insert into user1 values(001,'');//会报错

1.5 检查约束(check)

条件(CHECK)约束:表中每行都要满足该约束条件。条件约束既可以在表一级定义也可以在列一级定义。在一列上可以定义任意多个条件约束。

CONSTRAINT constraint_name CHECK (logical_expression)

举例:

create table user4

(id number primary key,

sal number check(sal>=1000 and sal<=2000),

sex char(2) check(sex in('男','女')));

insert into user4 values(1,5000,'男');//sal列的值不满足1000至2000,报错。

1.6 外键约束(froeign key)

外键(FOREIGN KEY)约束:用来维护从表(Child Table)和主表(Parent Table)之间的引用完整性。能够维护数据库的数据一致性,数据的完整性。防止错误的垃圾数据入库;

用于定义主表和从表之间的关系,外键约束要定义在从表上,主表则必需具有主键约束或是unique约束,当定义外键约束后,要求外键列数据必需在主表的主键列存在或是为null。

CONSTRAINT constraint_name

FOREIGN KEY (col_name1[, col_name2,…])

REFERENCES ref_table [(ref_col1[,ref_col2,…])]

[ ON DELETE { CASCADE | NO ACTION } ]

[ ON UPDATE { CASCADE | NO ACTION } ] ]

[ NOT FOR REPLICATION ]

houzhenhua@hope-pact.com

举例:

create table class(id number primary key,name varchar2());

create table stus(id number primary key,

name varchar2() not null,

classid number references class(id)

);

注意

1.外键指向主键列;

2.外键可以指向unique列;

3.建表时先建主表,再建从表;删除表先删从表,再删主表。

4.外键列属性值要与主键或unique列属性值的类型保持一致

5.外键列的值,必需在主键列中存在。但外键列的值允许为null

6.ON DELETE {CASCADE | NO ACTION}指定在删除表中数据时,对关联表所做的相关操作。在子表中有数据行与父表中的对应数据行相关联的情况下,如果指定了值CASCADE,则在删除父表数据行时会将子表中对应的数据行删除;如果指定的是NO ACTION,则SQL Server 会产生一个错误,并将父表中的删除操作回滚。NO ACTION 是缺省值。

例子

create table student(
sno number() primary key,
sname varchar2() not null,
age number(),
addr varchar2(),
idcard number()); create table course(
cno number()primary key,
cname varchar2(),
cscore number()); --创建外键约束的第一种方式
create table score(
stuno number() references student(sno), --创建第一个外键约束
couno number() references course(cno), --创建第二个外键约束
score number(,),
constraint pk_score primary key(stuno,couno)); --创建一个主键约束 --删除表及该表关联的约束
drop table score cascade constraints; --创建外键约束的第二种方式
create table score(
stuno number() constraint fk_stuno references student(sno), --创建第一个外键约束
couno number() constraint fk_couno references course(cno), --创建第二个外键约束
score number(,),
constraint pk_score primary key(stuno,couno)); --创建外键约束的第三种方式
create table score(stuno number(),
couno number(),
score number(,),
constraint fk_stuno foreign key(stuno) references student(sno),
constraint fk_couno foreign key(couno) references course(cno),
constraint pk_score primary key(stuno,couno));

insert into student values(1001,'zhangsan',19,'henanluoyang',98765432123456789);

insert into student values(1002,'lisi',19,'henanluoyang',98765432123456789);

insert into student values(1003,'wangwu',19,'henanluoyang',98765432123456789);

--查看student表中所有内容

select * from student;

--往course表中插入2条记录

insert into course values(9999,'Java基础',4);

insert into course values(9998,'数据库基础',2);

--查看course表中所有记录

select * from course;

--思考:insert into score values(1003,9997,89);能成功吗?不能,因为course表中不存在课程号为9997的课程

--思考:insert into score values(1003,9998,89);能成功吗?可以,因为1003在student表中存在,9998在course表中存在

--总结4:定义外键约束之后,删除父表中的记录,需要先将相关子表的记录删除

delete from student where sno=1003; --删除不掉,提示: 违反完整约束条件 (SYS.SYS_C0010808) - 已找到子记录

--正确的做法:

delete from score where stuno=1003;  --先删子记录

delete from student where sno=1003;  --后删父记录

1.7 默认值(default)

CONSTRAINT constraint_name

DEFAULT constant_expression [FOR column_name]

举例:

Create table stu(

id number primary key,

address varchar2() default ‘宿舍’);

insert into stu(id)  values();

二 约束管理

2.1 添加约束

如果在建表时忘记建立必要的约束,则可以在建表后使用alter table命令为表增加约束;

注意:

1)增加not null约束使用modify(因为字段(列)默认都是可以为空)

2) 添加默认值 alter table emps modify deptno default 10

2)增加其它四种约束使用add。

1.添加not null约束

alter table 表名 modify 字段名 not null;

2.添加unique(唯一)、primary key(主键)、foreign key(外键)和check(检查)约束

alter table 表名 add constraint 约束名 约束种类(字段);
示例:
--添加主键约束
alter table stuInfo
add constraint PK_stuNo primary key(stuNo)
--添加唯一键约束
alter table stuInfo
add constraint UQ_stuID unique(stuID)
--添加默认约束
alter table emps modify deptno default 10
--添加检查约束
alter table stuInfo
add constraint CK_stuAge check(stuAge between 15 and 40)
--添加外键约束
alter table stuInfo
add constraint FK_stuNo foreign key(stuNo) references stuInfo(stuNo)

2.2 删除约束

当不再需要某个约束时,可以删除。删除约束基本语法:

alter table 表名 drop constratint 约束名称;

约束名称指的是:一个表的每一个约束都对应一个名称。约束名称用户没有设置时,系统会自动分配一个名称。

在删除主键约束的时候,可能有错误,比如:alter table 表名 drop primary key;这是因为如果在两张表存在主从关系,那么在删除主表的主键约束时,必需带上cascade 选项。

基本语法:

alter table 表名 drop primary key cascade;

2.3 约束命名规范

约束名称:建议自己定义一套命名规则,否则使用系统生成的约束名,很难能把它和对应的表、字段联系起来。    

约束命名规则: 

唯一约束:     UK_表名_列名  

主键约束:    PK_表名  

外键约束:     FK_表名_列名 

条件约束:    CK_表名_列名 

2.4 显示约束信息

1)显示表约束信息

通过查询数据字典视图user_constraints,可以显示当前用户所有的约束的信息。

语法:

select constraint_name, constraint_type, status, validated

from user_constraints

where table_name = '表名';

注意:表名要大写

Type Code

Type Description

Acts On Level

C

Check on a table

Column

O

Read Only on a view

Object

P

Primary Key

Object

R

Referential AKA Foreign Key

Column

U

Unique Key

Column

V

Check Option on a view

Object

 

2)当然也有更容易的方法,直接用pl/sql developer查看即可。

2.5表级约束和列级约束

n  列级约束

列级约束:是在定义列的同时定义约束。

举例:如果在department表定义主键约束

create table department(

dept_id number(12) constraint pk_department primary key,

name varchar2(12), loc varchar2(12));

n  表级约束

表级定义:指在定义了所有列后,再定义约束。

举例:建立employee表时定义主键约束和外键约束为例:

create table employee(emp_id number(4),

name varchar2(15),

dept_id number(2),

constraint pk_employee primary key (emp_id),

constraint fk_department foreign key (dept_id) references department4(dept_id)

);

特别说明:not null约束不可以出现在表级定义中,not null约束只能在列级上定义。

一般情况下,我们使用列级定义即可。但是如果遇到定义复合主键(两列一起被定义为主键)时,需要用到表级定义。

2.6 联合主键

举例,将idname定义为复合主键:

create table test(id number,

name varchar2(64),nums number,

constraint pk_id_name primary key(id,name));

特别说明:不推荐大家使用复合主键。

三 序列

序列是什么?做什么用的?怎么用?需要注意哪些内容?

--序列是什么?有序的数字组成的一个排列   1 2 3 4 5 6 7

--做什么用?序列是一个独立的数据库对象,主要用来生成主键

--怎么用?

--创建序列:

create sequence seq01 --seq01序列名

start with           --序列的起始值

increment by         --步长

maxvalue          --序列的最大值

minvalue             --序列的最小值

nocycle               --nocycle(表示序列不循环)|cycle(表示序列循环使用)

cache ;             --cache (为了加快序列的生成速度,每次生成20个值,放到缓存中)|nocache(不往缓存中存放序列值,使用一次,生成一次)

--currval:返回序列的当前值,不会引起序列自增

--nextval:返回序列的下一个值,会引起序列自增

--查看序列的下一个值,会引起序列自增

select seq01.nextval from dual;--第一次使用序列的时候,必须使用 序列名.nextval

--查看序列的当前值

select seq01.currval from dual;

--序列的使用:

insert into student values(seq01.nextval,'zhang','男',,'河南信阳','');

--注意事项:一个sequence可以供多张表使用的。可能造成主键值的不连续。

--删除序列:

drop sequence seq01;

oracle-约束-序列的更多相关文章

  1. MySQL实现类似Oracle的序列

    MySQL实现类似Oracle的序列 2013-10-22 10:33:35     我来说两句      作者:走过的足迹 收藏    我要投稿 MySQL实现类似Oracle的序列   Oracl ...

  2. Oracle的序列

    Oracle的序列 序列介绍 序列是Oracle提供的用于产生一系列唯一数字的数据库对象. 使用序列能够实现自己主动产生主键值.序列也能够在很多用户并发环境中使用.为所实用户生成不反复的顺序数字,并且 ...

  3. ORACLE约束总结

    你对ORACLE约束的了解如何?比较模糊还是相当透彻?如果你对下面几个问题了如指掌的话,恭喜你,你已经对约束掌握得比较好了,不用看这篇文章了.ORACLE的约束有啥功能作用? 有哪些类型约束(不同版本 ...

  4. oracle导出序列的几种办法

    oracle导出序列的几种办法 注:本文来源于<oracle导出序列的几种办法> 方法一: select 'create sequence ' ||sequence_name|| ' mi ...

  5. 【Oracle】Oracle约束的总结

    你对ORACLE约束的了解如何?比较模糊还是相当透彻?如果你对下面几个问题了如指掌的话,恭喜你,你已经对约束掌握得比较好了,不用看这篇文章了.ORACLE的约束有啥功能作用? 有哪些类型约束(不同版本 ...

  6. Oracle中序列的操作以及使用前对序列的初始化

    Oracle中序列的操作以及使用前对序列的初始化   一 创建序列 create sequence myseq start with 1 increment by 1 nomaxvalue minva ...

  7. Oracle创建序列,Oracle创建序列语法

    -- Oracle创建序列 Create sequence CREATE SEQUENCE SEQ_SINGER -- 序列名称  START WITH 2 -- 开始数字  MAXVALUE 999 ...

  8. oracle约束约束状态和设计习惯

    oracle约束状态有几个项目,会让人迷惑,分别是: enable/disable--是否启用/禁用 validate/invalidate--确认/不确认 deferrable/not deferr ...

  9. 转 ORACLE约束总结

    https://www.cnblogs.com/kerrycode/archive/2012/05/13/2454614.html 你对ORACLE约束的了解如何?比较模糊还是相当透彻?如果你对下面几 ...

  10. oracle 重置序列从指定数字开始的方法详解

    原文 oracle 重置序列从指定数字开始的方法详解 重置oracle序列从指定数字开始 declare n ); v_startnum ):;--从多少开始 v_step ):;--步进 tsql ...

随机推荐

  1. Python学习day34-面向对象和网络编程总结

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  2. RQNOJ--2 开心的金明(01背包)

    题目:http://www.rqnoj.cn/problem/2 分析:这个题目每一种物品都是有"选"或"不选"两种情况. 属于01背包问题.物品的价格相当于背 ...

  3. 02-认识js

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. myeclipse工程更新后java图标变为空心的解决办法

    今天用svn更新了工程发现目录结构改变了,同时所有的java文件的图标变成了空心的.解决办法如下 1.右键单击工程目录名,选择properties. 2.选择java bulid path,正常的应该 ...

  5. tcpdump 抓包

    简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具. tcpdump可以将网络中传送的数据包的 ...

  6. CF1140F - Extending Set of Points

    题意:对于点集S,定义函数F(S)为对S不断扩展到不能扩展时S的点数.一次扩展定义为如果有一个平行于坐标轴的矩形的三个点在S中,则第四个点加入S. 动态在S中加点删点,每次操作完后求F(S)的值. 解 ...

  7. 【linux之路】常用的命令

    用bash插入代码 1.查看ubuntu的版本号 lsb_release –a //linux标准基础(Linux Standards Base):release发布 2.查看Ubuntu的内核 un ...

  8. 判断django中的orm为空

    result= Booking.objects.filter() #方法一 .exists() if result.exists(): print "QuerySet has Data&qu ...

  9. 省际联动distpicker插件的使用讲解

    1.在使用input页面加载script的引用 <script src="js/distpicker/distpicker.data.js"></script&g ...

  10. 20191005 - New Beginning

    真·反思 Before 发现$T1$是约瑟夫,$T2$不清楚,$T3$是算法进阶上的$LCIS$ During得&失 做的不错的地方: 多少想了T1的优化(最后没打完). T3的暴力写得很快也 ...