oracle 序列和约束

Posted zhangzonghua

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle 序列和约束相关的知识,希望对你有一定的参考价值。

序列 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);




















































































































































































































以上是关于oracle 序列和约束的主要内容,如果未能解决你的问题,请参考以下文章

Oracle --- 约束视图序列同义词

Oracle --- 约束视图序列同义词

Oracle中主键外键索引序列唯一性约束的创建

数据库 day60,61 Oracle入门,单行函数,多表查询,子查询,事物处理,约束,rownum分页,视图,序列,索引

具有序列提供的 id 的主键列上的唯一约束违规

将 Oracle 行序列化为 XML