oracle(9) 序列和约束

序列 SEQUENCE
也是数据库对象之一,作用:根据指定的规则生成一些列数字。
序列通常是为某张表的主键提供值使用。
主键:通常每张表都会有主键字段,该字段的值要求非空且唯一,
使用该字段来确定表中的每一条记录。

CREATE SEQUENCE SEQ_EMP_ID_JIE
START WITH 1
INCREMENT BY 1;

CREATE SEQUENCE 序列名
[START WITH i] --第一个序列值是I --默认值1
[INCREMENT BY J]--步进是J,下一个值每次加J --默认值1
[MAXVALUE N] --最大值是N
[MINVALUE N] --最下值是N
[CYCLE | NOCYCLE] --达到最大值后或者最小值后是否继续生产序列号
[CACHE] --用来指定先预取P个数据到缓存中,以提高效率,默认值是20;

序列提供了两个伪列:
NEXTVAL:获取序列的下一个数字,第一次获取时返回的是 STAR WITH 指定的数字。
以后都是最后获取的数字加上步进得到的。
NEXTVAL:会导致序列发生步进,且不可回退。
CURRVAL:获取序列当前的数字,即:最后一次生成的数字,且不会发生步进。

新创建的序列,必须使用一次 NEXTVAL 后才能使用 CURRVAL;
SELECT SEQ_EMP_ID_JIE.NEXTVAL FROM DUAL;--运行一次记一次
SELECT SEQ_EMP_ID_JIE.CURRVAL FROM DUAL;--最后一次的数字

删除序列:
DROP SEQUENCE SEQ_EMP_ID_JIE;

测试序列:
CREATE TABLE BIAO(
ID NUMBER(4),
NAME VARCHAR2(20)
);
INSERT INTO BIAO(ID,NAME)
VALUES(SEQ_EMP_ID_JIE.NEXTVAL,‘JACK‘);
SELECT * FROM BIAO;
DROP TABLE BIAO;

索引 INDEX

创建索引的语法:
CREATE [UNIQUE] INDEX 索引名
ON 表名(列名...);

CREATE INDEX INDEX_ENAME
ON EMP_XIAOJIE(ENAME);
复合所用也叫多列索引,是基于多个列的索引。
如果经常在 ORDER BY 子句中使用JOB和SAL排序:
CREATE INDEX EMP_JOB_SAL_JIE
ON EMP_XIAOJIE(JOB,SAL);

SELECT * FROM EMP_XIAOJIE
ORDER BY JOB,SAL;--自动应用 EMP_JOB_SAL_JIE 索引

基于函数的索引
CREATE INDEX EMP_ENAME_UPPER_J
ON EMP_XIAOJIE(UPPER(ENAME));

SELECT * FROM EMP_XIAOJIE
WHERE UPPER(ENAME)=‘KING‘;

修改和删除索引
如果经常在索引上执行DML操作,需要定义重建索引,来提高索引的空间
利用率,语法如下:
重建 EMP_ENAME_UPPER_J 索引:
ALTER INDEX EMP_ENAME_UPPER_J REBUILD;

当一个表中有不合理的所用会导致操作性能下降,删除索引:
DROP INDEX INDEX_ENAME;

合理使用索引提升查询效率:
为了提升查询的效率,创建和使用索引的原则:
*为经常出现在 WHERE 子句中的列创建索引
*为经常垂涎在 GROUP BY、DISTINCT 后面的字段建立索引,
如果建立的是复合索引,索引的字段顺序必须要和这些关键字
后面的顺序一致。
*为经常作为表的连接条件的列上创建索引。
*不要在小表上建立索引。
*限制表上的索引数目,索引不是越多越好。
*删除很少被使用的、不合理的索引。

****** 约束:
定义:
约束全称 约束条件,也叫完整性约束 在DDL 语句中
约束是在数据表上强制执行的一些数据检验规则,当我们执行
dml 操作时,数据必须满足这些规则,如果不符合则无法执行。
作用:
约束条件 可以保证表中数据的完整性,保证数据间的商业逻辑。
类型:
* 非空约束 not null ,简写 NN
* 唯一性约束 unique , 约束字段中的数据不能唯一,简写 UK
* 主键约束 primary key PK
* 外键约束 foreign key FK
* 检查约束 check CK

唯一性约束:UNIQUE UK
drop table day9_zhang;

create table DAY9_ZHANG(
id number (4),
name varchar2(20) unique, -----添加约束的第一种写法
INFO varchar2(30),
OWNER varchar2(10),
CONSTRAINT OWNER_zhang UNIQUE (owner) -----添加约束的第二种写法,能够给约束加一个名字

);

建表后取消约束:
alter table DAY9_ZHANG
modify (NAME varchar2(30));----有问题

alter table DAY9_ZHANG drop constraint OWNER_ZHANG;---删除约束
alter table DAY9_ZHANG drop constraint system.SYS_C0011567;
ALTER TABLE DAY9_ZHANG DROP UNIQUE (NAME);
建表后添加:
alter table DAY9_ZHANG
add constraint INFO_ZHANG unique(INFO);

alter table DAY9_ZHANG
add constraint zhang_idzhang unique(id);

insert into DAY9_ZHANG
values (1,‘QQ‘,‘INFO‘,‘55‘);

insert into DAY9_ZHANG
values (1,‘QQ‘,‘IN‘,‘55‘);

***** 主键约束 PRIMARY KEY
主键约束条件从功能上看相当于 非空约束且唯一的组合。
主键字段可以是单字段或多字段的组合。
作用:
在表中唯一的确定一行的数据。一个表只运行建立一个主键约束,
其他约束条件无个数限制

drop table day9_zhang2;

create table DAY9_ZHANG2(
id number (4),
name varchar2(20), -----添加约束的第一种写法
INFO varchar2(30),
OWNER varchar2(10),
CONSTRAINT ID_zhang PRIMARY KEY (ID) -----添加约束的第二种写法,能够给约束加一个名字

);

* 主键应是对系统无意义的数据
* 永远也不要更新主键,让主键除了唯一标识之外,再无其他的用途
* 主键不应该是动态数据,比如说时间戳
* 主键应该是自动生成,不要人为的干预。 可用序列
* 主键尽量建立在单列上

insert into DAY9_ZHANG2
values(seq_zhang.nextval,...)

外键约束
外键约束条件定义在两个表的字段或者一个表的两个字段上,用于
保证两个字段的关系

比如 EMP_ZHANG 表的DEPTNO 列参照 DEPT 表的DEPTNO 列。 则DEPT 表是主表或者说是父表
EMP 作从表或者子表。被参照字段必须是主键

外键约束对一致性的维护,从两个方面进行数据约束:
*从表上定义外键的列植,必须从主表被参照的列值中选取,或者为 null
*当主表参照列的值被从表参照时主表的改行记录不允许删除。
drop table emp_hua;
create table EMP_HUA(
id number (6),
name varchar2(20),
SAL number(6,2),
DEPTNO number(4)
);

alter table dept_zhang add constraint dept_zhang_pk primary key (deptno);

alter table EMP_HUA
add constraint EMP_HUA_DEPTNO_FK foreign key(DEPTNO)
REFERENces dept_zhang(deptno) ;
reference --参照的意思

insert into EMP_HUA
values(seq.nextval,‘傻逼‘,1000,10);
insert into EMP_HUA
values(seq.nextval,‘垃圾‘,1000,null);
select * from emp_hua;

delete from dept_zhang where deptno=10;

rollback;----回滚操作

外键约束对性能的降低:
如果在一个频繁 dml 操作的表上建立外键,每次DML 操作,都会将导致数据库自动对
外键所关联的对应的表作检查,产生资源开销。另外外键确定了主从表的先后生成关系,
有时候会影响业务逻辑。

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

检查约束:
员工薪水必须大于2000,增加约束:
select * from emp_hua;
alter table EMP_HUA
add constraint EMP_HUA_CK check (SAL>999);
insert into EMP_HUA
values(seq.nextval,‘电饭锅‘,5555,20);
insert into EMP_HUA
values(SEQ.NEXTVAL,‘肥嘟嘟‘,5555,20);

原文地址:https://www.cnblogs.com/zhangzonghua/p/oracle_seqence_constraint.html

时间: 2024-10-22 11:58:18

oracle(9) 序列和约束的相关文章

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

原文 oracle 重置序列从指定数字开始的方法详解 重置oracle序列从指定数字开始 declare n number(10); v_startnum number(10):=10000001;--从多少开始 v_step number(10):=1;--步进 tsql varchar2(200); v_seqname varchar2(200):='MIP_JF_SEQUENCE';--序列名 begin execute immediate 'select '||v_seqname||'.

Oracle的序列

Oracle的序列 序列介绍 序列是Oracle提供的用于产生一系列唯一数字的数据库对象.使用序列可以实现自动产生主键值.序列也可以在许多用户并发环境中使用,为所有用户生成不重复的顺序数字,而且不需要任何额外的I/O开销. 与视图一样,序列并不占用实际的存储空间,只是在数据字典中保存它的定义信息.用户要在自己的模式中创建序列,必须具有CREATE SEQUECNCE系统权限,如果要在其他模式中创建序列,则必须具有CREATE ANY SEQUENCE系统权限. 创建序列的语法如下: CREATE

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

Oracle中序列的操作以及使用前对序列的初始化 一 创建序列 create sequence myseq start with 1 increment by 1 nomaxvalue minvalue 1 二 初始化序列 select myseq.nextval from dual; 这里值得注意的是,如果先直接写select myseq.currval from dual,会提示会提示myseq.currtval尚未在此会话中定义. www.2cto.com 三 使用序列 初始化序列之后才可

oracle 删除外键约束 禁用约束 启用约束

oracle 删除外键约束 禁用约束 启用约束 执行以下sql生成的语句即可 删除所有外键约束 Sql代码 select 'alter table '||table_name||' drop constraint '||constraint_name||';' from user_constraints where constraint_type='R' 禁用所有外键约束 Sql代码 select 'alter table '||table_name||' disable constraint

Oracle修改序列(Sequence)起始值的方法

Oracle修改序列(Sequence)起始值的方法 Oracle 序列(Sequence)主要用于生成流水号,在应用中经常会用到,特别是作为ID值,拿来做表主键使用较多. 但是,有时需要修改序列初始值(START WITH)时,有同仁使用这个语句来修改:alter sequence sequencename start with xxxxxxxx.但是,在Oracle DB中,修改序列没有这样的语法.下面介绍几种修改方式: 1.先删除序列,然后重新创建.不过这不是当前要讲的重点.这个方法比较暴

MySQL实现类似Oracle的序列

MySQL实现类似Oracle的序列 2013-10-22 10:33:35     我来说两句      作者:走过的足迹 收藏    我要投稿 MySQL实现类似Oracle的序列 Oracle一般使用序列(Sequence)来处理主键字段,而MySQL则提供了自增长(increment)来实现类似的目的: 但在实际使用过程中发现,MySQL的自增长有诸多的弊端:不能控制步长.开始索引.是否循环等:若需要迁移数据库,则对于主键这块,也是个头大的问题. 本文记录了一个模拟Oracle序列的方案

序列-索引-约束

序列-索引-约束 1.序列 序列:也是数据库对象之一,作用是生成一系列的数字,序列常与某张表的主键字段提供值使用. 序列的创建: --序列的创建 CREATE SEQUENCE SEQ_NUM_2 START WITH 1 INCREMENT BY 2 START WITH:开始的值. INCREMENT BY :步长. 序列中的函数: A:NEXTVAL(获取序列的下一个值   第一个值获取的是START WITH 后面的值是START WITH+INCREMENT 每次加步长一次 ) 例:

【转】Oracle重置序列(不删除重建方式)

Oracle中一般将自增sequence重置为初始1时,都是删除再重建,这种方式有很多弊端,依赖它的函数和存储过程将失效,需要重新编译.不过还有种巧妙的方式,不用删除,利用步长参数,先查出sequence的nextval,记住,把递增改为负的这个值(反过来走),然后再改回来. 假设需要修改的序列名:seq_name 1.select seq_name.nextval from dual; //假设得到结果5656 2.alter sequence seq_name increment by -5

oracle创建序列&索引&视图

---oracle学习 --oracle的管理系统学习 --oracle的数据管理学习 --oracle的用户管理 --oracle二维表管理 --oracle的其他知识 --oracle的序列,视图,索引 --oracle的分页查询 --oracle的数据库备份 --oracle的图形化界面操作 序列 1 --oracle的序列的学习 2 --创建序列 3 --使用 create sequence 序列名 4 --特点1:默认开始是没有值的,也就是指针指在了没有值的位置. 5 --特点2:序列