概要图

一 约束

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

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

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

约束又分为列约束(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. webpack静态资源拷贝插件

    处理不需要使用webpack统一打包处理或webpack不支持的文件 安装 npm install copy-webpack-plugin --save-dev 配置 const copyWebpac ...

  2. 局域网下共享 MySQL 数据库连接

    转载自:https://blog.csdn.net/larger5/article/details/96974554 一.前言 在使用公司的一些开发框架,需要特定的 MySQL 版本,还要做一些配置操 ...

  3. PAT甲级——A1101 Quick Sort

    There is a classical process named partition in the famous quick sort algorithm. In this process we ...

  4. PAT甲级——A1075 PAT Judge

    The ranklist of PAT is generated from the status list, which shows the scores of the submissions. Th ...

  5. 关于排序--sort()和qsort()使用

    一.sort()函数的使用 使用sort()函数的时候要加上头文件#include<algorithm>和using namespace std. 这个函数接收两个或者三个参数. 第一个参 ...

  6. badboy的录制和jmeter的使用

    v  Jmeter是什么 Apache Jmeter是Apache组织开发的基于Java的压力测试工具. Jmeter可以用于对服务器.网络或对象模拟巨大的负载,来自不同压力类别下测试它们的强度和分析 ...

  7. AlexNet结构图详解

  8. 查找父进程,进程的PEB 进程是否被调试 NtQueryInformationProcess

    这个函数的功能很强大,可以用来查找进程的很多相关信息. 先看一下定义: NTSTATUS WINAPI NtQueryInformationProcess( _In_ HANDLE ProcessHa ...

  9. windows API 第八篇 _tcsicmp _stricmp _wcsicmp _mbsicmp

    这些函数都是比较字符串小写的,忽略大写,出入的字符串都将按照小写比较Perform a lowercase comparison of strings. 函数原型: int _stricmp( con ...

  10. NOIP2018崩崩记

    比赛前,做做往年的题目,嗯,似乎都很水,400+绝对没问题,如果完全发挥,起码500+. 然而-- Day0 这天是运动会,信息学的同学们向老师请假来机房. 然后我在机房里刷往届的题目,信心倍增. 最 ...