oracle 强制索引_约束和索引

约束(constraint)
定义:在建表时,为某些列添加特定的规则,保证数据库的数据满足用户的要求。添加约束之后,在往表中(插入、更新)数据时,如果数据不满足约束,则该条语句不能执行
分类:
1、非空约束 not null
2、唯一键约束 unique(若有值则唯一,若没值,null可以重复)
3、自定义检查约束 check(设定自定义检查条件)
4、主键约束 primary key(表示主列的约束关系)
5、外键约束 foreign key(表示两张表之间的关系)
添加约束:
1、在建表时,可以为某一列添加约束
1)在列的后面直接添加
2)约束之后可以起名
约束
2)
2、在建表后,可以通过修改添加约束
--非空约束 not null
ep:
create table demo01(
empno number(4),
ename varchar2(10) not null,
job vachar2(10)
)
insert into demo01 values(1234,'aa','SALES');
select * from demo01;
--唯一键 unique
ep:
creaate table demo02(
empno number(4) unique,
ename varchar2(10),
job varchar2(8)
)
insert into demo02 values(1234,'zhangsan','SALES');
--唯一,非空
ep:
creaate table demo03(
empno number(4) not null unique,
ename varchar2(10),
job varchar2(8)
)
insert into demo03 values(1234,'zhangsan','SALES');
--自定义检查约束 check
ep:
creaate table demo04(
empno number(4),
ename varchar2(10),
job varchar2(8),
age number(3) check(age)>0 and age<(200),
gender varchar2(3) check(gender='男' or gender='女')
)
insert into demo04 values(1234,'zhangsan','SALES',56);
--创建约束时,为约束起名 constraint
ep:
creaate table demo05(
empno number(4),
ename varchar2(10),
job varchar2(8),
age number(3) constraint ck_age check(age>0 and age<200)
)
insert int demo05 values(1234,'zhangsan','SALES',100);
--在添加列之后还可以添加约束,除了not null不可以
ep:
create table demo06(
empno number(4),
ename varchar2(10),
age number(3),
constraint uq_empno unique(empno),
constraint ck_age2 check(age>0 and age<200)
)
insert into demo06 values(1234,'zhangsan');
--主键约束
--为了保证改列的数据能够证明该行记录在表中华是唯一的
--主键约束从形式上看,类同于(非空和唯一)
ep:
create table demo07(
empno number(4) primary key,
ename varchar2(10),
age number(3)
)
insert into demo07 values(1234,'zhangsan',18);
--在列之后添加,一张表只有一个主键,但可以选择多个列作为联合主键
create table demo08(
empno number(4),
ename varchar2(10),
age number(3),
constraint pk_empno primary key(empno)
)
--外键约束 foreign key
--外键用来描述两张表的关系
--存在外间的表为从表,被依赖的表为主表,外键不一定为主表的主键,也可以是主表的唯一键,
ep:
create table t_class(
classid number(2) primary key,
classname varchar2(20) not null,
classnum varchar2(30) not null
)
insert into t_class values(10,'java班','教室6');
insert into t_class values(20,'大数据班','教室3');
insert into t_class values(30,'Python班','教室4');
create table t_student(
stuid number(8) primary key,
stuname varchar2(30) not null,
stuphone varcha2(11),
classid number(2) references t_class(classid) [on delete set null/cascade]可以添加操作策略,默认no action
)
insert into t_student values(11111111,'李狗蛋',110,10);
insert into t_student values(11111112,'李狗嗨',120,20);
--约束除了可以在建表时添加,还可以修改表时修改约束
alter table demo07 add constraint uq_demo07_ename unique(ename);
alter table demo07 drop constraint uq_demo07_ename
insert into demo07 values(1231,'zhangsan',18)
关系模型三类完整性规则:
1、实体完整性规则
2、参照完整性规则
3、用户定义的完整性规则


三范式
在设计和数据库有关的系统时,数据库表的设计至关重要,这些设计关系整个系统的架构,需要精心的仔细考虑。
数据库的设计主要包含了设计表结构和表间的联系,在设计的过程中,有一些规则应该遵守。
第一范式(1NF)
无重复的列,是最基本的范式,所有字段都是不可分解的原子值-->列不可分
第二范式(2NF)
数据不存在部分依赖的情况,一张表中所有列都依赖主键-->不能部分依赖
第三范式(3NF)
数据每一列都和主键直接相关,不能间接相关-->不能存在传递依赖


索引
类似于书的目录,是为了加快对数据的搜索速度而设立的,可以减少磁盘的I/O。sql索引是非显示索引,也就是在索引创建之后,在用户撤销它之前不会再用到该索引的名字,但是索引在用户查询时会自动起作用
--索引
create index idx_emp_ename on emp(ename)
select * from emp where ename = 'SMITH';
--只有添加索引的列,通过该列进行查询时,查询速度才可以加快
/*
使用条件:
1.当数据量非常大的时候
2.当该数列的数值非常多时,值不经常重复
3.当该列的值不经常变动时
*/
create table demo110(
id number(5) primary key,
name varchar2(20) not null,
nickname varchar2(30) unique
)
--数据库会为我们的表自动创建索引,为表中的唯一键自动的添加索引
--主键索引在Oracle中是强制的,一般用主键搜索会特别快
--求薪水最高的5个员工信息
select t.*,rownum
from(select e.*,rownum from emp e order by sal desc) t
where rownum <= 5
--求薪水6-10的员工信息
select tt.*
from(select t.*,rownum rn
from(select e.*,rownum from emp e order by sal desc) t
where rownum <= 10) tt
where rn >5
--分页查询(rownum)
--rowid用于区分每一条记录
select e.*,rowid from emp e;
delete from emp_temp where ename is null;
--数据去重(用于没有主键的列)
select e.*,rowid from emp_temp e
delete from emp_temp where rowid not in(select min(rowid) from emp_temp group by ename)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值