序列和约束的总结

1.2. 序列

1.2.1. 什么是序列
序列(SEQUENCE)是一种用来生成唯一数字值的数据库对象。序列的值由Oracle程序按递增或递减顺序自动生成,通常用来自动产生表的主键值,是一种高效率获得唯一键值的途径。

序列是独立的数据库对象,和表是独立的对象,序列并不依附于表。

通常情况下,一个序列为一个表提供主键值,但一个序列也可以为多个表提供主键值。

1.2.2. 创建序列
创建序列的语法:

CREATE SEQUENCE [schema.]sequence_name
    [ START WITH i ] [ INCREMENT BY j ]
    [ MAXVALUE m | NOMAXVALUE ]
    [ MINVALUE n | NOMINVALUE ]
    [ CYCLE | NOCYCLE ][ CACHE p | NOCACHE ]
其中:

sequence_name是序列名,将创建在schema方案下
序列的第一个序列值是i,步进是j
如果j是正数,表示递增,如果是负数,表示递减
序列可生成的最大值是m,最小值是n
如果没有设置任何可选参数,序列的第一个值是1,步进是1
CYCLE表示在递增至最大值或递减至最小值之后是否继续生成序列号,默认是NOCYCLE
CACHE用来指定先预取p个数据在缓存中,以提高序列值的生成效率,默认是20

1.2.3. 使用序列
举例说明,创建一个序列,起始数据是100,步进是10:

CREATE SEQUENCE emp_seq START WITH 100 INCREMENT BY 10;

当序列被创建后,第一个序列值将是100,将要生成的序列号分别是110、120、130等。

序列中有两个伪列:

NEXTVAL:获取序列的下个值
CURRVAL:获取序列的当前值
当序列创建以后,必须先执行一次NEXTVAL,之后才能使用CURRVAL。

获取序列的第一个值,并且使用序列值为EMP表插入新的记录:

SELECT emp_seq.NEXTVAL FROM DUAL;
INSERT INTO emp(empno, ename)VALUES(emp_seq.NEXTVAL, ‘donna’);
查询刚刚生成的记录,主键值将是110:

SELECT empno, ename FROM emp
WHERE ename = ‘DONNA’;
此时查询序列的当前值,会得到110的数字。

SELECT emp_seq.CURRVAL FROM DUAL;
在序列的使用过程中,比如执行了一条语句:

SELECT emp_seq.NEXTVAL FROM DUAL
则浪费了一个序列值,会导致表的主键值不连续。而CURRVAL的使用不会导致序列值的递进。

1.2.4. 删除序列
删除序列emp_seq:

DROP SEQUENCE emp_seq;

  1. 约束

2.1. 约束概述

2.1.1. 约束的作用
约束(CONSTRAINT)的全称是约束条件,也称作完整性约束条件。约束是在数据表上强制执行的一些数据校验规则,当执行DML操作时,数据必须符合这些规则,如果不符合则无法执行。

约束条件可以保证表中数据的完整性,保证数据间的商业逻辑。

2.1.2. 约束的类型
约束条件包括:

非空约束(Not Null),简称NN
唯一性约束(Unique),简称UK
主键约束(Primary Key),简称PK
外键约束(Foreign Key),简称FK
检查约束(Check),简称CK

2.2. 非空约束

2.2.1. 建表时添加非空约束
非空约束用于确保字段值不为空。默认情况下,任何列都允许有空值,但业务逻辑可能会要求某些列不能取空值。当某个字段被设置了非空约束条件,这个字段中必须存在有效值,即:

当执行INSERT操作时,必须提供这个列的数据
当执行UPDATE操作时,不能给这个列的值设置为NULL
建表时添加非空约束:

CREATE TABLE employees (
eid NUMBER(6),
name VARCHAR2(30) NOT NULL,
salary NUMBER(7, 2),
hiredate DATE
CONSTRAINT employees_hiredate_nn NOT NULL
);

2.2.2. 修改表时添加非空约束
可以在建表之后,通过修改表的定义,添加非空约束:

ALTER TABLE employees
MODIFY (eid NUMBER(6) NOT NULL);

2.2.3. 取消非空约束
如果业务要求取消某列的非空约束,可以采用重建表或者修改表的方式:

ALTER TABLE employees
MODIFY (eid NUMBER(6));

2.3. 唯一性约束

2.3.1. 什么是唯一性约束
唯一性(Unique)约束条件用于保证字段或者字段的组合不出现重复值。当给表的某个列定义了唯一约束条件,该列的值不允许重复,但允许是NULL值。

唯一性约束条件可以在建表同时建立,也可以在建表以后再建立。

2.3.2. 添加唯一性约束
在建表employees的同时,在eid、email列上创建唯一约束条件,并在建表后在name列上建立一个名为employees_name_uk的唯一约束条件:

DROP TABLE employees ; --将表删掉重新创建
CREATE TABLE employees (
eid NUMBER(6) UNIQUE,
name VARCHAR2(30),
email VARCHAR2(50),
salary NUMBER(7, 2),
hiredate DATE,
CONSTRAINT employees_email_uk UNIQUE(email)
);
在建表之后增加唯一性约束条件:

ALTER TABLE employees
ADD CONSTRAINT employees_name_uk UNIQUE(name);

2.4. 主键约束

2.4.1. 主键的意义
主键(Primary Key)约束条件从功能上看相当于非空(NOT NULL)且唯一(UNIQUE)的组合。主键字段可以是单字段或多字段组合,即:在主键约束下的单字段或者多字段组合上不允许有空值,也不允许有重复值。

主键可以用来在表中唯一的确定一行数据。一个表上只允许建立一个主键,而其它约束条件则没有明确的个数限制。

2.4.2. 主键选取的原则
主键应是对系统无意义的数据
永远也不要更新主键,让主键除了唯一标识一行之外,再无其他的用途
主键不应包含动态变化的数据,如时间戳
主键应自动生成,不要人为干预,以免使它带有除了唯一标识一行以外的意义
主键尽量建立在单列上

2.4.3. 添加主键约束
在建表时添加主键约束条件:

CREATE TABLE employees2 (
eid NUMBER(6) PRIMARY KEY,
name VARCHAR2(30),
email VARCHAR2(50),
salary NUMBER(7, 2),
hiredate DATE
);
建表后创建主键约束条件,并自定义约束条件名称:

CREATE TABLE employees3 (
eid NUMBER(6),
name VARCHAR2(30),
email VARCHAR2(50),
salary NUMBER(7, 2),
hiredate DATE
);
 
ALTER TABLE employees3
ADD CONSTRAINT
employees3_eid_pk PRIMARY KEY (eid);

2.5. 外键约束

2.5.1. 2.5.1 外键约束的意义
外键约束条件定义在两个表的字段或一个表的两个字段上,用于保证相关两个字段的关系。比如emp表的deptno列参照dept表的deptno列,则dept称作主表或父表,emp表称作从表或子表。

2.5.2. 2.5.2 添加外键约束
先建表,在建表后建立外键约束条件:

CREATE TABLE employees4 (
eid NUMBER(6),
name VARCHAR2(30),
salary NUMBER(7, 2),
deptno NUMBER(4)
);
 
ALTER TABLE employees4
ADD CONSTRAINT employees4_deptno_fk
FOREIGN KEY (deptno) REFERENCES dept(deptno);

2.5.3. 2.5.3 外键约束对一致性的维护
外键约束条件包括两个方面的数据约束:

从表上定义的外键的列值,必须从主表被参照的列值中选取,或者为NULL;
当主表参照列的值被从表参照时,主表的该行记录不允许被删除。

–成功DML语句:
INSERT INTO employees4(eid, name, deptno)
VALUES(1234, ‘rose tyler’, 40);–成功
INSERT INTO employees4(eid, name, deptno)
VALUES(1235, ‘martha jones’, NULL); --成功
 
–失败DML语句:
INSERT INTO employees4(eid, name, deptno)
VALUES(1236, ‘donna noble’, 50);
–失败,不存在部门50
DELETE FROM dept WHERE deptno = 40;
–失败,40被参照,不允许删除

2.5.4. 2.5.4 外键约束对性能的降低
如果在一个频繁DML操作的表上建立外键,每次DML操作,都将导致数据库自动对外键所关联的对应表做检查,产生开销,如果已在程序中控制逻辑,这些判断将增加额外负担,可以省去。

另外外键确定了主从表的先后生成关系,有时会影响业务逻辑。

2.5.5. 2.5.5 关联不一定需要外键约束
如果业务逻辑要求保证数据完整性,可由程序或触发器控制,不一定需要外键约束。

另外为了简化开发,维护数据时不用考虑外键约束,以及大量数据DML操作时不需考虑外键耗费时间。

2.6. 检查约束

2.6.1. 2.6.1 什么是检查约束
检查(Check)约束条件用来强制在字段上的每个值都要满足Check中定义的条件。当定义了Check约束的列新增或修改数据时,数据必须符合Check约束中定义的条件。

2.6.2. 2.6.2 添加检查约束
员工的薪水必须大于2000元,增加检查约束:

ALTER TABLE employees4
ADD CONSTRAINT employees4_salary_check
CHECK (salary > 2000);
当插入大于2000的数据,操作成功:

INSERT INTO employees4(eid, name, salary, deptno)
VALUES(1236, ‘donna noble’, 2500, 40);
试图修改职员的薪水为1500元,更新失败:

UPDATE employees4 SET salary = 1500
WHERE eid = 1236;
————————————————
版权声明:本文为CSDN博主「DataHamal Mr.张」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_41771218/article/details/83502372

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值