|
该用户从未签到
|
复习:SQL语句4 _; a) x$ X6 A5 I7 ]
select% r& ~' J1 ^% ]6 M X, g5 J
DML: insert / update / delete
0 n0 |9 Q6 U) e8 N7 p" \, x2 R$ B) B: ~' E' U' H+ y% {
CRUD
2 P' Y! d6 ]! ]) ?5 k" LC:Create
/ [2 u* B+ t; C$ B0 aR: Retrive! X* Z0 S9 A; u" \
U: Update
9 E' V: y& ?0 `: d/ [D: Delete X2 D) p) ?2 `; C1 r3 U7 B
8 l" C3 K, J# X+ r) y
DDL: create / drop / truncate / alter" a( F1 W5 g* C2 U/ J/ \/ Z$ J
. S8 k; U+ a X% F/ T
TCL: commit / rollback / savepoint6 P+ u8 [3 T+ p: F7 [ v9 ]4 n3 W
% o( R- L7 H- S' C9 J
DCL: grant / revoke
7 b6 Y3 u6 m( q+ _# y
1 C( j, C7 A2 bgrant: 赋予权限
) u+ n8 `$ H1 D% b- d# srevoke: 剥夺权限) v9 r. }$ c0 q! N9 X# N4 D$ g
数据库中的用户: openlab hr scott: K: a- b; C. [, O3 Q/ d E
emp0 v# G$ g1 w+ l3 ]. n
$ a. R9 r, B; s! M2 O: `0 l2 s
假设现在的用户是openlab
, v" r4 w; p' [9 ]; hSQL>grant select on emp to scott;
- ]& x% V; ~- @ USQL>revoke select on emp from scott;, o# y, |8 B6 N% P& Z2 |8 ~9 }
$ B% |7 E& Y7 D6 [! k, k6 W% Kscott的会话:
( M. L' X3 Q0 [; H' ASQL>select * from openlab.emp;
1 {& r8 r9 {# l$ t3 WSQL>select * from emp;
6 c' _8 }, q! \3 E
0 ^7 ]. }3 x) \1 a4 u( e/ G% y) T$ ? L
Oracle数据库的用户:
5 l/ ]! x. {% n, dsys$ B. r5 y+ ` r$ F) {! [
system
# r/ G( z! L7 P6 r% Z. [3 W0 F' Y2 ]" n! e0 j
scott/tiger
" H! b; |' o5 H( y. E7 ^openlab/open1235 z: X0 s7 ? X, a
ninglj/******
& T# P4 D3 S3 kexam/exam123% Y0 t, k* R2 i& o" k( {0 R6 |0 [
y0 _' i) N) d7 ]7 T) D% EC:>sqlplus scott/tiger@192.168.0.26:1521/tarena
2 M4 p3 |2 w E: F0 ]1 kSQL>" \1 F$ T' g, Y( O+ w' Z& n
8 y. _) T7 z3 r: h2 C" ^! y# b2 d! Z5 c. a7 M* D
今天的内容:* m( I, d1 u' L/ n) z
1、约束条件
' C! |$ e0 I7 {$ O2 N/ a% T2、数据库的其他对象1 `! L- c* B; W! m' {# X4 M3 a
9 b) _( H7 g9 M4 L& Q, c2 m, m
一、约束条件 Constraint- U# S9 I. D' J& L7 K+ P9 J
1。主键约束:Primary key, 简称PK
4 ]& k2 \( c+ L' D- q: N--建表时增加主键约束条件- A0 A- B" H% i8 Y$ |1 U: L0 ^1 b1 D
create table dept_ning1(/ r; h: f: _# y
deptno number(2) primary key, --列级约束条件
) P$ ?; T: [! G* y$ |5 G8 {9 o6 Adname varchar2(20),3 A/ y }: V! G5 I/ Q
location varchar2(40)/ S/ U; N# M: k- w! I
);
* ?% c$ J" ~% o" jinsert into dept_ning1
3 o: `( j( W( o5 C4 \values(10,'developer','beijing');1 @: a. F3 L2 c h/ D1 @
insert into dept_ning1 7 L9 l; {$ ]0 v$ |. o
values(10,'market','shenzhen');4 v% _$ a& c0 q }: K* H6 ?6 U
--如果插入重复编码,会提示: m0 o. t: Y1 H! o! y8 U
ORA-00001: unique constraint (NINGLJ.SYS_C00634053) violated0 l0 a* s/ q0 k' [+ Y/ G
其中,SYS_C00634053是数据库自定义的主键名& ]0 d$ m5 c( l* o3 q
--约束条件如果没有显式命名,( o, ]# ~; Z# l6 G( m( J, f
数据库给约束条件命名:SYS_C*****; V- C2 H7 x" F, K
4 w5 D4 g) Z7 H8 P
--在建表时自定义约束条件名5 m3 G7 F6 N! ]
--建议命名规则:表名_列名_约束条件的类型
# k+ S& ~3 E$ u3 z& b. Acreate table dept_ning2(
- E, v* i' l4 R Zdeptno number(2),0 f" K) D* J. j; n
dname varchar2(20),' S3 q r( F0 g3 Y$ P$ T0 q+ |- E
location varchar2(40),
* T# H# c; `$ ^" j- l& T& `8 w- g6 oconstraint dept_ning2_deptno_pk
% D& C4 m2 H# }7 uprimary key (deptno) --表级约束条件
% z% N# `) |, g4 m1 K/ O); g+ ^! y$ i1 N) l% e/ ^
--当插入重复编码时,会提示具体的约束条件名字错误。9 E1 O8 M2 |+ A$ k' o5 A' ]1 B
--方便定位出错的原因
, ^& H r8 W. o" V0 ^( }2 T: Y0 n; o' r1 a, ~1 W
主键约束:primary key = 不能重复 + 不能为空+ J5 _, {6 a" R5 q- W
6 A; m0 F- [1 I7 x
2、非空约束: not null,简称NN
' l' A1 ?2 Z: [- p6 Q0 o; }学生姓名必须提供,但是可以重复6 w. } Q5 t5 @& }8 ~
--只能定义在列级/ q! A0 L9 b) y Z) p& |
create table student_ning(
) o8 G. M7 h& x% K' Z/ l" A% Jid number(4) primary key,' P" E6 Z" I1 Q7 K+ e
name varchar2(10) not null,
+ O z- D7 D9 B6 A. v. sage number(2)
3 d2 w, n% N0 j* L);: N4 i' k, s- \( n2 m
insert into student_ning 5 u& D8 F3 A0 B# R$ `
values(1, 'zhangwei', 20);+ ]3 [5 z) v9 V0 D
--名字可以重复2 Q1 B" m. V! e6 F
insert into student_ning
3 p" D, ~6 \/ K$ v8 kvalues(2, 'zhangwei', 19);
0 g9 e! Y% B& e: c8 Y--提示name列不能为NULL, @2 J: S: h+ G! r
insert into student_ning
' c' }1 G% l, m, X j. w6 O3 yvalues(3, null, 18);1 o! z, Z W# [; S
% ]# x4 n: E3 @3、唯一约束:Unique,简称UK3 u, v8 T- k3 h# ~( s2 g2 G0 @
create table student_ning1(; i* k" V( s; q
id number(4) primary key,
" m! [+ |, V# [* r' \name varchar2(10) not null,
/ h7 c" M+ t$ n6 `# t" b) s4 kemail varchar2(30) unique,4 G9 r8 _! R/ J2 B! {
age number(2)
9 I- ?* C# ?: D, U3 x);) R2 i. Y% a; j8 ^! d5 _" d
insert into student_ning1
) }7 s4 H0 T+ c: P( Nvalues(1,'amy','amy@doctor.com', 19);4 s/ y7 U: Z7 Z6 f0 a3 a
--ORA-00001: 唯一约束条件被违反
# N. d' H; }% m! V8 ]6 l, u& ginsert into student_ning1
9 R3 \! \3 Z4 y2 ~values(2,'rory','amy@doctor.com', 19);
8 e; o, u2 m$ c" H* p4 |3 G9 X# h- m& Q% r! k- |
--唯一约束建立在表级# e' g4 p; u) Q9 b
--主键约束建立在表级
( z; G3 _/ G) g3 k" j. Zcreate table student_ning2(
; g {( {. W# Q5 f# hid number(4), j' q# H7 Y" D- }7 F
name varchar2(10) not null,
3 N: u4 Z1 V4 D' Hemail varchar2(30),, E {3 z; }$ l$ H0 L; p% S5 i! i
age number(2),
. ?9 U+ d" ]/ C7 [0 m- @0 ~constraint student_ning2_id_pk0 j) b' Y; g/ s# N. z' d6 `% L
primary key (id),
% j) _1 h8 P$ Oconstraint student_ning2_email_uk
3 H" M5 l8 ?) d8 uunique (email)
K- U2 R8 h; v);; v. c% m1 o6 f! o3 X p
' T5 s) m5 |6 K2 d+ I' linsert into student_ning2
h, c" U) ~" P) O4 W# Q' _4 h" Svalues(1,'amy','amy@doctor.com',19);
9 s8 ]0 K+ Z1 C% ?. Q# p2 q0 R. [% W0 l) |" _
--unique约束只要求不能重复,可以为NULL
( O8 Q$ `* _) [: M3 U: Ainsert into student_ning2
5 }. V8 E- y1 [$ _ avalues(2, 'rory', null, 20);3 o7 Q$ p4 i& c* n8 t7 I8 E
) D# Q9 e& G& ]) a! n/ n/ i T--不管是insert还是update,email都不能重复。
% a2 M+ e* I2 m2 dupdate student_ning2 set email = 'amy@doctor.com'1 j0 y! o7 K6 @; j# V
where id = 2;
- Q& x7 }9 f d& T6 u; G% \. b$ |8 n$ G) f! ]9 t
4、检查约束 check 简称 CK
+ z5 v7 `2 }9 V( M$ V) S- v: vcreate table student_ning3(0 S6 M Z' C$ D
id number(4),
. k$ b! v' q( `3 s6 Y" x4 Iname varchar2(10) not null,. T: L7 }3 e5 e% Z/ c
email varchar2(30),
7 F# w2 C! ]; h4 t, [7 E- Z, [age number(2),
2 X5 h# L4 C7 |gender char(1), --'F':女生; 'M':男生0 ]+ n9 |7 {; @" ]: W) h
constraint student_ning3_id_pk
( O3 @+ R; s' l) j: w' ^) [# C, |9 hprimary key (id),
/ A* U! m. k1 cconstraint student_ning3_email_uk- m% w) V' v N1 T0 c5 m1 y4 |$ H
unique (email),4 \/ q* N0 Q9 d2 R5 H
constraint student_ning3_age_ck! |9 o! i# D0 b
check (age > 10),
( [; _6 ^" ?0 v9 rconstraint student_ning3_gender_ck% m% n+ \. W ?' V) ~" P
check (gender in ('F', 'M', 'f', 'm'))
7 Q- a: g2 u; k% S);
8 M1 C, @/ v- ^6 kinsert into student_ning3
$ T( t/ ~: d2 h- q, Mvalues(1,'amy',null,19,'F');6 {" J0 }1 v1 _- K7 p
insert into student_ning3+ _3 C/ W& {3 L2 b& C. \
values(2,'rory',null,8,'M'); --违反check约束 age > 109 L" b9 U7 ?1 U5 E2 w0 s! z, P
insert into student_ning3
2 L' F+ J) W0 vvalues(3,'doctor',null,50,'A'); --违反check约束 gender in ('F','M')
% i# Y9 d0 f) J) J
1 F4 ]9 }+ A+ Y6 D& y UPK / NN / UK / CK / FK3 Y4 Z9 o9 N- ~4 D3 w [. b
$ A) p) z0 s) G8 R% _6 j
5.外键. Foreign key, 简称FK
3 Y$ O# m# j0 P. Wcreate table major_ning (
4 q M. u' P3 r9 sid number(2) primary key, ( w3 ]6 v: e1 D- i
name char(20)/ l' D v0 c5 v q
);
# N w$ s) A9 S5 _. ]5 Rinsert into major_ning values(1, 'computer');
+ [6 C2 i8 o/ I( X) O$ J# V+ J5 sinsert into major_ning values(2, 'history');2 g& J% e1 S E
insert into major_ning values(3, 'music');
8 a+ E& }1 k: u2 k3 l" vinsert into major_ning values(4, 'sing');
* B/ A) y% r6 ^" I C2 Y: Kcommit; }4 G" f2 k( ]! _, j! F2 C7 {
create table student_ning4(
. S- q$ `3 {- ksid number(3),
* }! e' G: M j& p3 ]& i8 aname varchar2(20) not null,
2 B7 e- \& Q5 u3 Remail varchar2(30),7 ?3 o( I6 T+ Y* I' |
gender char(1),
' B1 n# h, Q# Y5 r8 v3 a% }majorid number(2),* {2 O" {, T0 e% t7 T# X4 e* @* T
constraint stu_n4_sid_pk primary key(sid),- h+ g" }) `' n0 T& W$ j7 Y
constraint stu_n4_email_uk unique (email),
4 |4 ?, H0 p) ^4 j( iconstraint stu_n4_g_ck check (gender in ('F','M')),) X) I' \, |; f, p8 N: w" ^
constraint stu_n4_mid_fk foreign key
& y: H3 G; L2 `% V) e (majorid) references major_ning(id)
/ k( N8 f9 w9 [3 S9 K);
6 v8 y3 a. h$ `" I& ?2 @( N& y$ m0 [/ M7 S: N% q2 ]
insert into student_ning4+ a! {8 M K8 b
values(101,'amy',null,'F',1);
' ^ [3 R; H3 N--新增数据,不存在9这个专业
% o- v* g |& M! Xinsert into student_ning4
# T4 c0 c( {2 [3 y- vvalues(102,'river',2 o+ D8 ^0 C; I* v
'river@sina.com','F', 9);
6 H6 l) u# e7 m. ~--提示错误:
% }8 s! r( b: nORA-02291: integrity constraint (NINGLJ.STU_N4_MID_FK)
6 T% Z: d7 l' d& U, E3 p violated - parent key not found
" L! u' r2 i" S- |( Pinsert into student_ning49 B. l! f2 }9 f
values(102,'river',
$ V. L% M: \$ O1 v; }'river@sina.com','F', null);" o& ]4 n- p/ N7 r7 \0 }
. ]8 o* _1 y3 V+ r# u/ ?
--有学生属于专业1(computer)5 i {6 t. J* }* l/ X! `
delete from major_ning where id = 1;" I+ M, \' q' g% `% w' _1 [
--ORA-02292: child record found' i& R) ]5 N- b3 b
% o7 X% c. e0 V7 e; F
create table student_ning5(& g8 l9 n' l) O3 Z+ i; Y+ A
sid number(3),
% d/ p! x/ V" X( wname varchar2(20) not null,0 u" o5 ^' ~" \3 m+ b9 ^
email varchar2(30),; E T. T' J0 T6 l4 j
gender char(1),' n5 e3 n/ C& q) v
majorid number(2),! {" b& c4 A0 u3 `$ F8 G( G$ d
constraint stu_n5_sid_pk primary key(sid),0 W6 r) x( U6 o: `6 l
constraint stu_n5_email_uk unique (email),
* e. R. f: B7 l8 Kconstraint stu_n5_g_ck check (gender in ('F','M')),
# X7 H' N5 m! ^8 ?/ Cconstraint stu_n5_mid_fk foreign key 8 V# _% V( a3 D
(majorid) references major_ning(id)3 N6 |: m! F, a( J. l4 R
on delete set null);; l9 F8 m, k& y! M. _& o
: c* i! J& G9 X* \* r
insert into student_ning5
! J' x9 G6 S. j$ p/ E: zvalues(101,'amy',null,'F',4); --amy是4专业的学生2 \; @) I3 k- g/ J- y9 ]
--删除编码为4的专业
) P4 m5 I) _: wdelete from major_ning where id = 4;; ?9 ~( Y6 v2 I# [
--amy的专业被设置为NULL: b4 a! }( Y! L1 Y8 N$ y
select * from student_ning5; % X' B: _( h% q6 U6 N0 ?5 o" p" z
! q) G/ I* h( G X! U8 o$ q5 ~
create table student_ning6(9 i& M/ e% p5 ^ r6 d# `2 p0 h
sid number(3),* J Q: l4 [2 u3 v/ F6 ]
name varchar2(20) not null,4 Z" q% p7 E& O/ z6 S6 {
email varchar2(30),/ h* t: H, ]; u
gender char(1),. O2 I+ Z4 |7 t2 x1 g7 o
majorid number(2),
( ^# e* @6 g( y# C6 N iconstraint stu_n6_sid_pk primary key(sid),
& Q5 D* g9 P/ Y" kconstraint stu_n6_email_uk unique (email),
: H4 I. }. o) k2 M3 x0 Hconstraint stu_n6_g_ck check (gender in ('F','M')),$ L3 }2 s8 q1 H2 l
constraint stu_n6_mid_fk foreign key 3 i1 U* v/ M' G
(majorid) references major_ning(id)8 ~( O# Z+ |* ^0 V6 d
on delete cascade);
' k. E. ~. w- B1 ^' O. ~9 ^* j1 \& t0 u# w) i
--复制表,不复制约束条件。
# }9 o, u+ F; Q. r( P& a: ucreate table 表名 as 查询语句* j/ }; a0 C1 e7 E# ?! x9 H! F
+ q# s `0 A' u o. J+ `: }% ^' x
--建立约束条件的时机7 B9 h$ ?! E1 t2 {
--建表同时建立约束条件:; C4 r# m6 W6 J( _- i
create table student(- I% Q; G. c2 v% z0 W) ]8 {
id number(3),
. W* x! X4 U) {* B+ F& W4 }name char(20) not null,
! x4 f3 ?( J/ ]3 L, L, ^7 lmajorid number(2),
( q' T7 Y! Z* E% D; a, [constraint stu_id_pk primary key(id),
* u! { V" u5 z" m2 x7 q s/ dconstraint stu_mid_fk foreign key(majorid)
" w( w. R0 n& v' d1 Q references major(id)3 Y9 V4 f! G5 H* U- i$ X
);
6 V' D- M2 N# q2 Z4 \& e--在创建完表以后创建约束2 F" M0 u# A1 E) ]3 y& t" Q
create table student(* d: d9 e2 y! s$ ~" o1 M
id number(3),' R: f) n/ `8 J- { e* {
name char(20) not null,
2 C P c/ s9 l4 s+ H' pmajorid number(2));
9 i5 _5 e; c0 L3 h0 nalter table student
2 A" n# w9 b0 o [ add constraint stu_id_pk primary key(id);1 v/ }; v; D+ c5 ?
alter table student
9 u: H, b+ d6 _7 d8 G add constraint stu_mid_fk foreign key(majorid)
& x* {1 n) a* L/ l7 T7 c @! B references major(id); z C- K' f; d3 d
+ ~) e- M1 [, H. W% s) {
-----------脚本文件begin---------* e$ K* X( t! w2 D/ Z& ^/ D
alter table student drop constraint stu_mid_fk;
- ]( ~8 F7 A( idrop table student;
s0 g$ ?5 b) m D* @) w9 E! @( @9 kdrop table major;
2 p: t) S1 U( ecreate table major(....);3 o" j7 r/ ]4 m" P& s% a& E9 f! Q4 l
create table student(....);
7 t& t) n, c% p. I# y8 Ralter table student add constraint ....
" Y. j1 E# A1 T" {$ W2 {; R-----------脚本文件end------------
7 f, a& ?6 l3 K) R% Z1 S" g- K4 ^
. {0 T" C* L9 T }! r9 vuser_tables :用户所有的数据表# l# Q* x: U& o) O- y
user_constraints:用户所有的约束条件
5 d& l) N9 J9 a% Nuser_objects :用户所有的对象(表、视图、索引...)3 [: d! H" Q1 m, |6 d6 N4 T& @4 W
7 l/ p* _' e& T. M! _; b9 R- D
all_tables :用户能访问的数据表,
$ s: c3 T, |# s1 x0 r/ K" \' P7 m 包括自己的和别的用户允许自己访问的
) ]2 B7 m; i0 u0 v7 Hall_constraints:用户能访问的约束条件
0 }/ {3 j, x. Q$ fall_objects :用户能访问的对象(表、视图、索引...)
& P# S( m6 B) A }; [) B" x( a% K
PK / FK
7 ]4 A! U& \& [6 M" ~, \% b8 MNOT NULL / UNIQUE
4 M. f! z3 W U& h" I2 n8 ICHECK% n3 v v- I$ V9 U
其中:CHECK和NOT NULL可以在程序级别控制0 q3 z' T- F) N! t6 r
E' @* E; U8 `. V# `6 |) l5 d
二、数据库的其他对象$ G5 d9 v$ g$ l1 {& S' P
表 Table
- A8 v |3 W+ M5 B; Q视图 View# a" X5 O: `) J5 H
索引 Index
" y H; X7 X% p/ d8 E' |6 p序列 Sequence
: p, m6 f. j8 @, J, A. O) N过程 Procedure
+ D4 ?; |# @" g9 j, s: ~( x函数 Function
2 ]& M$ c% O1 t" c包 Package
! R# z) @. G8 v触发器 Trigger" o5 O. T+ J( K$ F7 X9 l) O S
同义词 Synonym
0 w; B1 x" x5 V9 a% x....
" o$ b7 b2 D; Q. C2 f& Y% B2 b* q$ i/ a4 Y/ V
1.视图View6 l, S2 d8 `& I& A% |! [* F- f
create view v_emp_ning
) z3 t, ]2 U/ V0 c, ^0 {as0 y7 `; G, E; L( f j
select empno, ename, job from emp_ning
! d0 N L; \' nwhere deptno = 20;! C# \" g& r2 A9 a) i
--使用和表相同' Z/ \' ]4 \& d) e( C
desc v_emp_ning% h. S, C! W. F
select * from v_emp_ning;
" j/ r* [- r1 Z+ N, E/ V! C/ m/ C! Z--视图的好处:简化查询;隐藏数据表的列5 H9 x* [, q( f. k; p" {6 s
# B( H4 N, j) V! ^; p0 D/ w+ ^
create view v_emp_count
2 a/ A- n' B! v+ Y) Ias: ]5 v5 {7 F3 o1 c- ?, g- j
select deptno, count(*) emp_num$ R8 {$ k; }6 ~, {
from emp_ning
" G& @9 }: t- M$ _1 B$ L/ D" ?, }1 rgroup by deptno;
* a" a+ C2 I' ^( N* _" q8 `--修改基表数据* i2 _" B( f% F3 p
update emp_ning set deptno = 10
' e, f0 {3 N: r+ H where deptno is null;2 I" b4 W9 i2 t7 F4 a; e# E
--视图查询到的是修改后的数据。
9 R0 ]2 c1 ` S- c4 _--视图不包含任何数据。是基表数据的投影。
( E2 ]' s$ x( `: D) L- ?select * from v_emp_count; g$ ?0 h+ l/ i* s
4 V* x- R3 o4 o2 B! z% r2 A--创建或修改视图7 H. S4 {" {* n4 b! l
create or replace view v_emp_count
5 Z: Q3 v" m: q+ f5 fas
4 T4 S9 D5 [" C) x" ^/ N# Y6 ^select deptno, count(*) emp_num,
( A$ m5 c: [; t" e S jsum(salary) sum_s,
9 ?* G! {% A1 b- i9 } h) Oavg(nvl(salary,0)) avg_s,
4 O( w n0 D q) {% rmax(salary) max_s,
% g* ~( Y+ |5 ~- R3 _* C8 |min(salary) min_s
1 Y6 u& I% n) U" r7 \6 @from emp_ning/ D5 z% l% f+ j* ~2 j1 R
group by deptno;) y9 k6 s/ C0 \* t0 U5 G7 w* g
7 m# m% [- T& B3 x* n. z
--查询视图的定义) |/ |: J! w3 `
select text from user_views
2 |: z' ?, Q, v/ g+ zwhere view_name = 'V_EMP_COUNT';
/ }, H' W: G* z) L9 {--如果视图对应的sql语句显示不全( _ \- m% _8 _+ `# U/ s4 T
set long 1000
9 A: N$ Y4 b% o; \- j* y- Z1 ^! ~% W( Z2 {
2.索引 Index :用来提高查询效率的机制。' [" a) c( L$ T
全表扫描: Full Table Scan: 查询效率极低
4 I3 @1 x3 i- h0 s* k/ v2 Q" x索引查询:比全表扫描快。+ D2 s2 O; u- k, u
% o9 }; j8 v) s# a0 `; i3 B索引的结构:数据 + 地址
& _: x2 Y) Y( o/ Y4 x 张三 + Room203
( [9 i$ [# d$ a2 ^' t; g) R
0 w+ K" m8 F$ U& G. g8 y对于数据变更频繁(DML操作频繁)的表,* S4 A1 g w6 x# |2 T% s! Y! c" k
索引会影响性能。
0 F! K! G. z2 O5 G/ ^% S) A% Q n: ^- l9 m3 r6 ?
如果数据表有PK/Unique两种约束,索引自动创建" E2 Z C/ }0 }( y& P- `6 Y
除此以外,索引必须手动创建。
; @6 D3 @4 `& N' Mcreate table student_ning7(* A/ ]5 J# U: ?
id number(4),
[; V" }6 V0 r9 P9 d8 i# @name char(20),
9 b9 r; V$ z7 U5 ` Eemail char(40),
3 l9 x% [1 h5 R- C1 h1 a2 [$ y3 U: Yconstraint stu_n7_id_pk primary key(id),
& N, z! Q4 Y; u/ fconstraint stu_n7_email_uk unique(email)
: h) ~3 Q- p- b0 I, G% |, C8 Z);7 H; c9 l7 T" D- D6 f, `
select constraint_name
0 H ?. k9 d! b* c; @+ d# Qfrom user_constraints
! p' P- K3 m, _! Lwhere table_name = 'STUDENT_NING7';& Q2 p @- K. k2 U: e8 k
. i) Q; @0 k4 K5 }, v* A" ?; _
--查询student_ning7表上的索引,2 _4 g" b! w: ^( X/ j- R
和主键/唯一约束条件同名,数据库自动创建的索引。
4 t0 F% p" U/ F* |6 ^1 nselect index_name from user_indexes
. B- e& n3 f" Owhere table_name = 'STUDENT_NING7';
8 C1 b# C' t8 b+ m' [
! e: J$ H6 R0 a--凡是id或email上的查询,会使用索引, _) A! q1 m+ ~& N, N3 m
select * from student_ning7
7 f& k/ Z, X6 i, u& ~0 T+ h8 ?; Pwhere id = 1001;
) W/ ]# }( I, ?0 G( W4 v# r& O
: N( z: T \; y/ k0 O; P--这种查询用不到索引:全表扫描
- g( f- p4 w" c" v: _select * from student_ning7! j; g# A( X1 \5 c2 l5 B* y' ]
where name = 'zhangsan';% Y/ j* T6 i: I# X
( W6 Z, _: m5 u7 \--创建基于名字字段的索引,索引名自定义
# `+ w3 K1 E# I) c$ V M/ ncreate index 索引名 on 表名(列名);
) P( X% D" E0 c: d- r+ P ocreate index idx_stu7_name
; x4 x' u3 X6 Z/ V8 o2 eon student_ning7(name);: i: U3 v6 V- L3 J
. u! Z- W9 s/ Z" G- i: l索引:
: ~% |4 w3 Q# h: U7 c, z i1)了解索引的工作原理7 d. W$ @9 z+ s T5 C
2)pk/uk自动创建索引/ @4 R+ d3 ?; e/ |& A
3)根据查询情况决定手动创建哪些索引。
/ e5 \$ V7 m$ w* o" ~
?8 y' ]7 G9 R3 e, X$ |- Y# \) K: f- H# i" ?) z# r: b
3、序列 Sequence --Oracle独有的
; {+ u1 b1 F. b0 q) c; @- U% n--产生从1开始的数字值,步进是1
1 ~/ w! m; b0 C* u+ |8 k0 `create sequence myseq_ning;, C0 [3 s4 f9 p7 w1 I% F: s& N3 d7 O
select myseq_ning.nextval from dual;8 H6 a6 [4 S d0 V5 g; ` b
1 k) ?+ M0 S/ M$ y( ~: ^# q
序列的特性:产生连续的不同的数字值8 f3 h6 H) {1 p% T
用来作为数据表的主键。3 e3 [/ k+ I4 f$ M( P/ M4 [' j
/ }. L. x- a% A0 U M' E* a$ H
--使用序列产生的值作为表的主键值5 M% v2 ]. k( m$ j* z
insert into student_ning7(id,name)
6 i! F' Z. E( X. a$ ] Fvalues(myseq_ning.nextval, 'amy');! p8 A' D# u' X1 Z" ^* z( y1 x A
& y+ K7 C6 Q! B7 s5 D1 }+ Nstudent_ning7和序列myseq_ning的关系:
5 J. U4 P# Y: O3 b `/ b, Z5 ~是数据库中的独立对象
) Z6 U: ]% u+ r R/ _3 p--表可以用序列产生的值作为主键,也可以不用
9 ~# q: x$ o# Z Q& V--序列可以为一个或多个表产生主键,也可以不用
# U: d5 k) `1 ^$ ?! u6 V9 N3 O$ Oinsert into student_ning7(id,name)( x1 b2 A9 Q8 a5 {' X) Z$ X
values(100,'river'); T2 r, b) P5 w$ I/ A
insert into dept_ning
& t* ^/ r( K( q) Cvalues(myseq_ning.nextval,'market','bj');. c& ] [) l5 m n8 E
- `* m7 t' S. f3 D) Z--建议:一个序列为一个表产生主键
l7 {9 p% o2 R* b/ D! C
B' ]7 H6 N- K% ]希望主键值从1000开始,步进是2?
$ P% c0 ]' ?8 ~6 S' t- o/ ~create sequence myseq_ning1
" T# \5 k, j% tstart with 10003 H6 z. e8 Y" d4 P
increment by 2;
% k; C( u* ?1 ]4 [+ j' P
1 V+ _7 I, p( Z" o) _/ jinsert into student_ning75 s0 Q& o& t# D
values(myseq_ning1.nextval, 'song', null);3 n, T g' P4 L8 b
9 `( p. O( j$ u# D
--删除序列,对曾经产生过的数据没有任何影响。
" _0 G9 m" j9 a3 M( Z% J0 j4 sdrop sequence myseq_ning1;8 y- u8 n, }, W5 Y1 C& Q
4 i* X! v5 ]; h9 Y0 {SQL> edit
/ u* ^+ l- \; B+ m3 {% n+ \1 i+ L3 r. _2 c4 r) y: i2 w2 e
|
|