Oracle-11 序列、索引、同义词和约束


序列:通常用来生成主键值,可用来自增或自减数字

简单创建
create sequence emp_seq;

复杂创建:指定所有属性值
create sequence emp_seq
start with 1 –从1开始取值
increment by 1 –每次累增1
minvalue 1 –最小值为1
maxvalue 9999999 –最大值为9999999
nocycle –无循环
cache 20 –默认缓存20个值在内存中

currval与nextval伪列
注意:同一会话中,需先执行nextval才能获取currval
select emp_seq.nextval from dual;–查看序列生成的下一个值
select emp_seq.currval from dual;–查看序列生成的当前值


使用序列

insert into emp(empno,ename,job) values(emp_seq.nextval,’tom’,’sales’);

修改序列:出start with之外的值都可以修改
alter sequence emp_seq
increment by 1
minvalue 1
maxvalue 2000; –注意:最大值不能小于序列的当前值

删除序列
drop sequence emp_seq;


索引:通常用优化查询速度

创建索引
在emp表的ename字段上创建索引
create index emp_ename_index on emp(ename); –单列索引

在emp表的deptno和job的组合上创建索引
create index emp_dept_job_index on emp(deptno,job);–复合索引

测试索引
创建表emp_bak,复制emp表结构,以及所有的数据
create table emp_bak as select * from emp;

批量新增数据到emp_bak表中(单位:百万)
insert into emp_bak select * from emp_bak; –多次重复执行,目前3670016

将empno列的数据更新为唯一值
update emp_bak set empno = rownum; –第一种方式
update emp_bak set empno = emp_seq.nextval; –第二种方式

alter table emp_bak modify(empno number(10));
–原empno长度为4,精度不够,修改为长度10

测试效率–(可借助F5(explain plan window)窗口分析SQL语句执行效率)
select * from emp_bak where empno=3000000; –无索引 0.12左右
create index emp_empno_index on emp_bak(empno);–创建empno列的索引
select * from emp_bak where empno=3000000; –有索引 0.015左右

删除索引
drop index emp_empno_index;

数据字典
select * from user_tables; – 查询表
select * from user_constraints;–查询约束
select * from user_cons_columns; –查询约束及相关列
select * from user_indexes;–查询当前用户所有的索引
select * from user_ind_columns;–查询当前用户的所有索引,及相关列


同义词

创建同义词(private私有同义词:属于当前用户scott)
create synonym e for emp;–相当于给emp表取别名
–权限不足,sys授权
grant create synonym to scott;
–测试
select * from scott.emp;
select * from scott.e;

创建同义词(public公有同义词:属于共有用户,不属于某一指定用户)
create public synonym a for emp;
权限不足,sys授权
grant create public synonym to scott;
测试
select * from a;

删除同义词
drop synonym e;


not null(不为空约束)
只能定义列级别的约束
值不可以为空(不允许null 与 ”)

不指定约束名称
创建emp备份表,且约束雇员姓名与部门编号不能为空
create table emp_bak(
empno number(4),
ename varchar2(10) not null,–列级别约束 ,系统命名SYS_C0010855
job varchar2(9),
mgr number(4),
hiredate date,
sal number(7,2),
comm number(7,2),
deptno number(2) not null –列级别约束,系统命名SYS_C0010856
);

指定约束名称
创建emp备份表,且约束雇员姓名与部门编号不能为空
create table emp_bak(
empno number(4),
ename varchar2(10) constraint emp_ename_nn not null,–列级别约束,命名emp_ename_nn
job varchar2(9),
mgr number(4),
hiredate date,
sal number(7,2),
comm number(7,2),
deptno number(2) constraint emp_deptno_nn not null –列级别约束,命名emp_deptno_nn

测试是否允许为空
insert into emp_bak values(1,’张三’,’程序猿’,9999,sysdate,5000,500,10);
insert into emp_bak(empno,ename,deptno) values(2,’李四’,20);

测试是否允许null ” ’ ’ 0等值
insert into emp_bak(empno,ename,deptno) values(2,’李四’,null);–不可以
insert into emp_bak(empno,ename,deptno) values(2,’李四’,”); –不可以
insert into emp_bak(empno,ename,deptno) values(2,’李四’,0); –可以
insert into emp_bak(empno,ename,deptno) values(2,0,10); –可以
insert into emp_bak(empno,ename,deptno) values(2,’ ‘,10); –可以
insert into emp_bak(empno,ename,deptno) values(2,”,10); –不可以


unique(唯一约束)
–能定义列级别,也能定义为表级别约束
–值必须唯一,但可以为null
–默认给当前列添加索引,用来加速当前列的查询速度,例如select * from emp_bak where empno=7788;
–可以同时给一列或多列定义组合约束
–每一个表可以同时定义多个unique唯一约束

不指定约束名称
创建emp备份表,且约束雇员姓名唯一(列级别),雇员编号唯一(表级别)
create table emp_bak(
empno number(4),
ename varchar2(10) unique,–列级别约束 ,系统命名SYS_C0010859
job varchar2(9),
mgr number(4),
hiredate date,
sal number(7,2),
comm number(7,2),
deptno number(2),
unique(empno)–表级别约束,系统命名SYS_C0010860
);

指定约束名称
创建emp备份表,且约束雇员姓名唯一(列级别),雇员编号唯一(表级别)
create table emp_bak(
empno number(4),
ename varchar2(10) constraint emp_ename_unique unique,–列级别约束 ,命名emp_ename_unique
job varchar2(9),
mgr number(4),
hiredate date,
sal number(7,2),
comm number(7,2),
deptno number(2),
constraint emp_empno_unique unique(empno)–表级别约束,命名emp_empno_unique
);
insert into emp_bak(empno,ename) values(3,null);
insert into emp_bak(empno,ename) values(3,null);–违反唯一约束scott.SYS_C0010860
insert into emp_bak(empno,ename) values(4,’tom’);

定义组合唯一约束(多列)
创建emp备份表,且约束雇员姓名与雇员编号组合唯一(表级别)
create table emp_bak(
empno number(4),
ename varchar2(10),
job varchar2(9),
mgr number(4),
hiredate date,
sal number(7,2),
comm number(7,2),
deptno number(2),
constraint emp_no_name_unique unique(empno,ename)–表级别约束,命名emp_no_name_unique
);
insert into emp_bak(empno,ename) values(4,’tom’);
insert into emp_bak(empno,ename) values(4,’marry’);
insert into emp_bak(empno,ename) values(5,’marry’);
insert into emp_bak(empno,ename) values(5,’marry’);–违反唯一约束条件,scott.emp_no_name_unique


primary key(主键约束) : not null + unique
1.能定义列级别,也能定义为表级别约束
2.值必须唯一,且不可以为null
3.默认给当前列添加索引,用来加速当前列的查询速度,例如select * from emp_bak where empno=7788;
4.可以同时给一列或多列定义组合约束
5.每一个表只能允许存在一个主键

create table emp_bak(
empno number(4), –constraint emp_empno_pk primary key,–列级别约束,命名emp_empno_pk
ename varchar2(10),
job varchar2(9),
mgr number(4),
hiredate date,
sal number(7,2),
comm number(7,2),
deptno number(2),
constraint emp_empno_pk primary key(empno,ename) –表级别约束,命名emp_empno_pk
);

insert into emp_bak(empno,ename) values(‘1’,’tom’); –ok


foreign key(外键约束)
1.能定义列级别,也能定义为表级别约束
2.取值范围必须为对应表的对应列中的值,可以为null
3.每一个表可以存在多个外键
4.外键关联列只能是唯一键或者主键列
5.主键表主键值被外键表参照时,主键表记录不允许被删除,提示已找到子记录,可级联删除或清空

create table emp_bak(
empno number(4),
ename varchar2(10),
job varchar2(9),
mgr number(4),
hiredate date,
sal number(7,2),
comm number(7,2),
deptno number(2), –constraint emp_deptno_fk references dept(deptno) –列级别约束,命名emp_deptno_fk
constraint emp_deptno_fk foreign key(deptno) references dept(deptno) –表级别约束,命名emp_deptno_fk
);

insert into emp_bak(empno,ename,deptno) values(1,’tom’,null);–ok
insert into emp_bak(empno,ename,deptno) values(1,’tom’,10);–ok
insert into emp_bak(empno,ename,deptno) values(1,’tom’,60);–not ok 未找到父项关键字,即在dept表的deptno列中找不到该值
delete from dept where deptno=80; –not ok 已经找到子记录,可级联删除或清空,如下on delete cascade || on delete set null

级联删除 on delete cascade
create table emp_bak(
empno number(4),
ename varchar2(10),
job varchar2(9),
mgr number(4),
hiredate date,
sal number(7,2),
comm number(7,2),
deptno number(2),
constraint emp_deptno_fk foreign key(deptno) references dept(deptno) on delete cascade
);

insert into emp_bak(empno,ename,deptno) values(1,’tom’,10);–ok
insert into emp_bak(empno,ename,deptno) values(1,’tom’,80);–ok
delete from dept where deptno=80;–1.删除dept表deptno=80的部门 2.删除外键关联表emp_bak中deptno=80的所有数据

级联清空 on delete set null
create table emp_bak(
empno number(4),
ename varchar2(10),
job varchar2(9),
mgr number(4),
hiredate date,
sal number(7,2),
comm number(7,2),
deptno number(2),
constraint emp_deptno_fk foreign key(deptno) references dept(deptno) on delete set null
);

insert into emp_bak(empno,ename,deptno) values(1,’tom’,10);–ok
insert into emp_bak(empno,ename,deptno) values(1,’tom’,80);–ok
delete from dept where deptno=80;–1.删除dept表deptno=80的部门 2.清空外键关联表emp_bak中deptno=80的所有部门数据


check(检查约束)
1.能定义列级别,也能定义为表级别约束
2.取值范围必须为约束条件约定的范围
3.每一个表可以存在多个check约束

– > >= = < <=运算符
create table emp_bak(
empno number(4),
ename varchar2(10),
job varchar2(9),
mgr number(4),
hiredate date,
sal number(7,2), –constraint emp_sal_check check(sal >=1600),–列级别约束
comm number(7,2),
deptno number(2),
constraint emp_sal_check check(sal >=1600)
);
insert into emp_bak(empno,ename,sal) values(1,’tom’,1600);–ok
insert into emp_bak(empno,ename,sal) values(1,’tom’,1599);–not ok 违反约束条件scott.emp_sal_check

in()运算符
create table emp_bak(
empno number(4),
ename varchar2(10),
job varchar2(9),
mgr number(4),
hiredate date,
sal number(7,2),
comm number(7,2),
deptno number(2),
constraint emp_job_check check(job in(‘程序媛’,’程序猿’,’IT人’))
);
insert into emp_bak(empno,ename,job) values(1,’tom’,null);–ok
insert into emp_bak(empno,ename,job) values(1,’tom’,’SALES’);–not ok 违反检查约束条件scott.emp_job_check
insert into emp_bak(empno,ename,job) values(1,’tom’,’程序猿’);–ok

between..and..运算符
create table emp_bak(
empno number(4),
ename varchar2(10),
job varchar2(9),
mgr number(4),
hiredate date,
sal number(7,2),
comm number(7,2),
deptno number(2),
constraint emp_sal_check check(sal between 1600 and 99999)
);
insert into emp_bak(empno,ename,sal) values(1,’tom’,null);–ok
insert into emp_bak(empno,ename,sal) values(1,’tom’,99999);–ok
insert into emp_bak(empno,ename,sal) values(1,’tom’,1500);–not ok

综合定义emp表
create table emp_bak(
empno number(4) constraint emp_empno_pk primary key,
–primary key主键约束
ename varchar2(10) constraint emp_ename_unique unique,
–unique唯一约束
job varchar2(9) constraint emp_job_nn not null,
–not null 非空约束
mgr number(4),
hiredate date,
sal number(7,2) constraint emp_sal_check check(sal>0),
–check检查性约束
comm number(7,2),
deptno number(2) constraint emp_deptno_fk references dept(deptno)
–foreign key外键约束
);

追加约束

create table emp_bak(
empno number(4),
ename varchar2(10),
job varchar2(9),
mgr number(4),
hiredate date,
sal number(7,2),
comm number(7,2),
deptno number(2)
);
alter table emp_bak add constraint emp_empno_pk primary key(empno);–主键约束
alter table emp_bak add constraint emp_ename_unique unique(ename);–唯一约束
alter table emp_bak add constraint emp_sal_check check(sal>0); –检查性约束
alter table emp_bak add constraint emp_deptno_fk foreign key(deptno) references dept(deptno);–外键约束

–not null非空约束
alter table emp_bak modify(job constraint emp_job_nn not null);


删除约束

alter table emp_bak drop primary key; –删主键
alter table emp_bak drop constraint emp_empno_pk; –删主键

alter table emp_bak drop unique(ename);–删唯一键
alter table emp_bak drop constraint emp_ename_unique;–删唯一键

alter table emp_bak drop constraint emp_sal_check;–删检查性约束
alter table emp_bak drop constraint emp_deptno_fk;–删除外键

–alter table emp_bak modify(job);–not ok设置为可以为null
alter table emp_bak drop constraint emp_job_nn; –允许为null


禁用约束

alter table emp_bak disable constraint emp_empno_pk;–禁用主键
alter table emp_bak disable constraint emp_ename_unique;–禁用唯一键
alter table emp_bak disable constraint emp_sal_check;–禁用检查性约束
alter table emp_bak disable constraint emp_deptno_fk;–禁用外键
alter table emp_bak disable constraint emp_job_nn;–禁用非空约束


启用约束

alter table emp_bak enable constraint emp_empno_pk;–启用主键
alter table emp_bak enable constraint emp_ename_unique;–启用唯一键
alter table emp_bak enable constraint emp_sal_check;–启用检查性约束
alter table emp_bak enable constraint emp_deptno_fk;–启用外键
alter table emp_bak enable constraint emp_job_nn;–启用非空约束

drop table emp_bak;
select * from emp_bak;
select * from dept;

查看约束的数据字典表
select * from user_constraints;–查看当前用户所有的约束
select * from user_cons_columns where constraint_name =’EMP_DEPTNO_FK’; – 查看约束及对应的列名

猜你喜欢

转载自blog.csdn.net/qq_36090002/article/details/81395211