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 ...
随机推荐
- css - flex 定义排列方向
flex-direction定义伸缩项目放置在伸缩容器的排列方向,对应有四个值: (1)row:从左到右或从右到左 (2)row-reverse:与row属性相反 (3)column:从上到下排列 ( ...
- spring-boot-autoconfigure-xx.jar核心注解
- Day5 - F - 食物链 POJ - 1182
动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A.现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种.有人用两种说法 ...
- MySQL之表、列别名及各种JOIN连接详解
MySQL在SQL中,合理的别名可以让SQL更容易以及可读性更高.别名使用as来表示,可以分为表别名和列别名,别名应该是先定义后使用才对,所以首先要了解sql的执行顺序(1) from(2) on(3 ...
- 015、Java中定义变量时不设置内容,使用变量前设置内容
01.代码如下 package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- Codeforces Forethought Future Cup Elimination Round 选做
1146C Tree Diameter 题意 交互题.有一棵 \(n(n\le 100)\) 个点的树,你可以进行不超过 \(9\) 次询问,每次询问两个点集中两个不在同一点集的点的最大距离.求树的直 ...
- C#动态获取本机可用串口的两种方式
1. private void GetSerialPort() //获取串口列表 { RegistryKey keyCom = Registry.LocalMachine.OpenSubKey(&qu ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-star-empty
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- centos7上安装mysql8
话不多说仍然是更换虚拟机的系列安装. 一.首先下载最先版的mysql.到官网下载https://dev.mysql.com/downloads/file/?id=477146 下载后上传linux到相 ...
- 文本编辑器vim/vi——命令模式
一个完整的指令的标准格式: Linux通用的格式——#指令主体(空格) [选项](空格) [操作对象] 一个指令可以包含多个选项,操作对象也可以是多个. vim指令: 指令:vim (vim是一款 ...