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);
oracle(9) 序列和约束的更多相关文章
- MySQL实现类似Oracle的序列
MySQL实现类似Oracle的序列 2013-10-22 10:33:35 我来说两句 作者:走过的足迹 收藏 我要投稿 MySQL实现类似Oracle的序列 Oracl ...
- Oracle的序列
Oracle的序列 序列介绍 序列是Oracle提供的用于产生一系列唯一数字的数据库对象. 使用序列能够实现自己主动产生主键值.序列也能够在很多用户并发环境中使用.为所实用户生成不反复的顺序数字,并且 ...
- oracle 删除外键约束 禁用约束 启用约束
oracle 删除外键约束 禁用约束 启用约束 执行以下sql生成的语句即可 删除所有外键约束 Sql代码 select 'alter table '||table_name||' drop con ...
- oracle导出序列的几种办法
oracle导出序列的几种办法 注:本文来源于<oracle导出序列的几种办法> 方法一: select 'create sequence ' ||sequence_name|| ' mi ...
- Oracle删除主键约束的同时删除索引
继续昨天的折腾(Oracle修改主键约束),删掉主键约束后,发现唯一索引并未删掉.仔细看了下,主键约束跟唯一索引名称不一样,这说明是先创建了唯一索引,后创建的主键约束.我们来试验下: SQL> ...
- Oracle中序列的操作以及使用前对序列的初始化
Oracle中序列的操作以及使用前对序列的初始化 一 创建序列 create sequence myseq start with 1 increment by 1 nomaxvalue minva ...
- Oracle创建序列,Oracle创建序列语法
-- Oracle创建序列 Create sequence CREATE SEQUENCE SEQ_SINGER -- 序列名称 START WITH 2 -- 开始数字 MAXVALUE 999 ...
- oracle 重置序列从指定数字开始的方法详解
原文 oracle 重置序列从指定数字开始的方法详解 重置oracle序列从指定数字开始 declare n ); v_startnum ):;--从多少开始 v_step ):;--步进 tsql ...
- 【转】Oracle重置序列(不删除重建方式)
Oracle中一般将自增sequence重置为初始1时,都是删除再重建,这种方式有很多弊端,依赖它的函数和存储过程将失效,需要重新编译.不过还有种巧妙的方式,不用删除,利用步长参数,先查出sequen ...
随机推荐
- Docker 学习之mysql与redis(二)
在上一随笔中主要就是记录docker的基本使用以及nginx与php服务器的配置:在这一章将主要记录docker安装mysql与redis. 本节随笔参考网址:https://www.runoob.c ...
- django中使用ORM模型修改数据库的表名
在django中,使用models.py创建好一张表后,如果不指定表的名字,那么表的名字就默认为 model_modelname 例如: class Book(models.Model): id = ...
- Windows下 dmp文件的产生
一.windows下的崩溃捕获windows程序当遇到异常,没有try-catch或者try-catch也无法捕获到的异常时,程序就会自动退出.windows系统默认是不产生程序dmp文件的.dump ...
- 011.Delphi插件之QPlugins,延时加载服务
这个DEMO是是把DLL插件的相关信息做成了一个配置文件,主程序加载这个配置文件,从而起到延时加载的作用 主程序代码如下 unit Frm_Main; interface uses Winapi.Wi ...
- List<Object> 查询解析优化
2018年3月16日 大型仪器设备分类查出后,需要展示个分类下总共有多少台设备.因为分类总共分三层,加起来数据700+.以后该系统上线设备可能达到2000+,这样统计每个分类下的设备可能会拖垮服务器. ...
- mysql DDL语言
- 将git本地仓库同步到远程仓库
同步到远程仓库可以使用git bash 也可以使用tortoiseGit 1.使用git bash 在仓库的所在目录,点击右键选择“Git Bash Here”,启动git bash程序. 然后再gi ...
- POJ3616:Milking Time
Milking Time Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5682 Accepted: 2372 Desc ...
- windows下移植别人配置好的python环境
一般来说,我们在windows下配置python环境的时候可能会比较推荐用anaconda,那么有一个比较方便的anaconda环境移植方法,也就是说,如果我已经在windows上安装好了anacon ...
- reduce()、filter()、map()、some()、every()、...展开属性
reduce().filter().map().some().every()....展开属性 这些概念属于es5.es6中的语法,跟react+redux并没有什么联系,我们直接在https:// ...