oracle关联字段和序列,oracle(9) 序列和约束

5268f80b9b1e01f982625ef6fac83ca1.png

序列 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(9) 序列和约束

标签:唯一性   运行   默认值   select   外键约束   提高   商业   更新   build

1428d0e076c3959ab11d28a39bc84fab.png

5268f80b9b1e01f982625ef6fac83ca1.png

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:https://www.cnblogs.com/zhangzonghua/p/oracle_seqence_constraint.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值