表和视图
- [; p# v: c# u9 J! d4 i+ C
- e% p# B0 m; ]3 o Oracle中表是数据存储的基本结构。ORACLE8引入了分区表和对象表,ORACLE8i引入了临时表,使表的功能更强大。视图是一个或多个表中数据的逻辑表达式。本文我们将讨论怎样创建和管理简单的表和视图。 5 Z9 e; A0 x' [. { ^$ T6 c
' O- z5 c- R5 s5 P; \ 管理表 4 b1 [5 g* m, l, Q. s$ Y3 _5 @5 d
) u2 Y$ b, `2 j) g$ d 表可以看作有行和列的电子数据表,表是关系数据库中一种拥有数据的结构。用CREATE TABLE语句建立表,在建立表的同时,必须定义表名,列,以及列的数据类型和大小。例如: 2 T0 U# h, _6 B' [6 ]' N
9 h& y1 K: y3 ^. ?1 [. Z$ ^CREATE TABLE products ' _. g8 }+ h6 U9 V* ?
( PROD_ID NUMBER(4), $ T1 v: a: l! \2 r. x0 x) l3 Q
PROD_NAME VAECHAR2(20), " i( e, i5 Z/ T) ?2 x/ L, r" J
STOCK_QTY NUMBER(5,3)
% F- h" }9 J a7 E5 j );
2 u9 e9 ~. G- Z( J/ z0 H5 Q
0 B# Y4 w! O9 t! B5 P 这样我们就建立了一个名为products的表, 关键词CREATE TABLE后紧跟的表名,然后定义了三列,同时规定了列的数据类型和大小。
" }( Q5 |7 [/ e) H: t! w8 U& ?! u6 {$ o4 H
在创建表的同时你可以规定表的完整性约束,也可以规定列的完整性约束,在列上普通的约束是NOT NULL,关于约束的讨论我们在以后进行。 # ?3 |1 k* M. h3 V" P/ R
5 _' ~7 g( M( q" E1 I 在建立或更改表时,可以给表一个缺省值。缺省值是在增加行时,增加的数据行中某一项值为null时,oracle即认为该值为缺省值。
* S/ _; u, H7 z m- W* n ^6 C
0 ^* R/ F x* I4 ~, Z6 t+ | 下列数据字典视图提供表和表的列的信息: / G$ ~. O0 D. _6 B
/ x! v9 j$ C; o* j, d
. DBA_TABLES ! J0 M& U) C+ h/ y z& N* s
. DBA_ALL_TABLES ) r$ t% T- O, Q- @+ i- X7 L
. USER_TABLES
1 ?" P/ Q2 O y j6 H% r' ] . USER_ALL_TABLES # E6 J3 ]3 u, b6 I8 F0 A1 x7 w
. ALL_TABLES
u+ ` w1 S w5 r$ ~ . ALL_ALL_TABLES 9 l }' J, B$ f# o$ x6 r/ c7 M
. DBA_TAB_COLUMNS
2 F# ]3 |! y3 n4 E2 N . USER_TAB_COLUMNS ' `* E y$ p" f6 B! V
. ALL_TAB_COLUMNS 3 b6 k U4 Z% [3 y6 H: \
* f: g3 v$ B G, L* L& o6 Q+ S3 t 表的命名规则 , V# s; O: n( K0 _$ o
5 J! T- P" m* q* N 表名标识一个表,所以应尽可能在表名中描述表,oracle中表名或列名最长可以达30个字符串。表名应该以字母开始,可以在表名中包含数字、下划线、#、$等。 " @& {1 G% b* F0 R5 q, Y% p
! ?. m8 O6 \ J% d/ U4 C 从其它表中建立表
, R1 d% T% |1 P0 N$ J$ S- z; Z* i0 C4 r2 l4 f6 V; y. d- G9 q
可以使用查询从基于一个或多个表中建立表,表的列的数据类型和大小有查询结果决定。建立这种形式的表的查询可以选择其他表中所有的列或者只选择部分列。在CREATE TABLE语句中使用关键字AS,例如: # ^& t: k7 @ K0 g+ F
5 v9 C, n! K* z$ K- t- c1 X4 |( V; RSQL>CREATE TABLE emp AS SELECT * FROM employee
! g- S- R7 I% i+ t, L* s9 z! \8 ^. |. s, M
TABLE CREATED
2 R# p% J7 o+ r/ o" P$ M i& Z$ e" b
" N; q+ W1 s# t2 ], MSQL> CREATE TABLE Y AS SELECT * FROM X WHERE no=2
: d9 d! G# X9 q9 M' v f* j, L9 T9 B, e% t$ m* f
需要注意的是如果查询涉及LONG数据类型,那么CREATE TABLE....AS SELECT....将不会工作。
! U/ n6 z( j# K/ \( ]0 \8 b$ g R8 q
更改表定义 0 F$ R* @. g+ L c) Q2 Z
1 w; j- Y1 }3 P 在建立表后,有时候我们可能需要修改表,比如更改列的定义,更改缺省值,增加新列,删除列等等。ORACLE使用ALTER TABLE语句来更改表的定义
u: i, n7 K. A
I, s, F6 \8 }0 d 1、增加列
# J, T* X$ [4 L7 {/ X3 M" b, O' p x! g. L
语法: $ p7 D6 ?/ m, U9 ]# v
/ U' ?& G( m5 D5 @
ALTER TABLE [schema.] table_name ADD column_definition
( E/ e5 I7 J# R3 ~2 Y3 C- m+ T4 J3 u1 g+ i# t% m; ^; m
例:
7 c( z. m: F' I$ g/ e$ T; ~5 Y3 t" W ?4 ?
ALTER TABLE orders ADD order_date DATE; 1 @; x+ `0 n/ I; d
1 @# k! `( q# ]) _% { x P \4 T; aTABLE ALTER " U! a( s1 p* D2 j
& `0 ^* a8 O- R* X- x 对于已经存在的数据行,新列的值将是NULL.
* \2 v2 b" A6 y 2、更改列
3 r# `0 J$ ]$ I; d( ?) N8 b! V/ L7 v+ e+ F+ L0 s" P, O
语法: 5 @, u3 u2 Q+ k) X1 f
3 k7 `! I7 i+ S4 e5 MALTER TABLE [schema.] table_name MODIFY column_name new_attributes; 2 y4 F/ \2 |% J- {* z: F3 z
2 ^" p$ A* c9 y9 Q8 _- U1 t* A& o
例: / d' B9 |- A4 v8 E3 O
0 Y% c: p9 d& o* N" ?3 z. d: X/ aALTER TABLE orders MODITY (quantity number(10,3),status varchar2(15));
% C" e: S/ o. @2 ?( x( O: r" G0 V, ^, |0 |! k4 ]
这个例子中我们修改了表orders,将STATUS列的长度增加到15,将QUANTITY列减小到10,3;
% M7 c: L! I9 G. L; d3 E
# B( J# o4 s# s6 R% n0 F% t 修改列的规则如下:
& S1 O& X0 t: ^' u1 N! _) H- \9 C0 i r: g! B8 t6 f
. 可以增加字符串数据类型的列的长度,数字数据类型列的精度。 / u) B3 E! t/ d3 M: I1 y
2 `' F; r" k* N0 E, K2 @8 P9 }
. 减少列的长度时,该列应该不包含任何值,所有数据行都为NULL. Z2 O# b7 b4 X$ e
3 O" l$ |& V8 |: J a* g' a . 改变数据类型时,该列的值必须是NULL.
5 B7 b5 d) Z# Y* M; S! c) U0 S
3 i2 Y, w' |. H! U( c% Q0 d . 对于十进制数字,可以增加或减少但不能降低他的精度。
$ r4 Y3 v. \9 ]1 g) L7 v3 a% W6 x0 j7 \4 u1 a1 L
3、删除数据列
8 ]9 s* t& o1 d, \# N) O
' T9 O" {. ~# Z- i 优化ORACLE数据库,唯一的方法是删除列,重新建立数据库。在ORACLE8i中有很多方法删除列,你可以删除未用数据列或者可以标示该列为未用数据列然后删除。 8 c) g! v K) r6 h9 l/ }2 X# Y
3 ~$ U4 w5 u; T& A& V2 J 删除数据列的语法是: % b# X6 v8 w) I
; v+ I9 M0 k1 ?# z; U E, m
ALTER TABLE [schema.] table_name DROP {COLUM column_names | (column_names)}[CASCADE CONSTRAINS] * u8 Z9 o1 r- t7 i* F: q; O9 g0 r% q4 O
; y- `: b2 Y5 e) M
要注意的是在删除列时关于该列的索引和完整性约束也同时删除。注意关键字CASCADE CONSTRAINS,如果删除的列是多列约束的一部分,那么这个约束条件相对于其他列也同时删除。
& s' w g1 E) T* L& u+ K1 \: a( G2 p- ]6 o$ u0 V7 }, {
如果用户担心在大型数据库中删除列要花太多时间,可以先将他们标记为未用数据列,标记未用数据列的语法如下: w5 @8 H. n u2 A8 s
0 R0 @: ?# }' \1 r) w* }$ Q1 RALTER TABLE [schema.] table_name SET UNUSED {COLUM column_names | (column_names)}[CASCADE CONSTRAINS]
) R; F2 Z2 N, g% E5 @% Z- U# D4 t! @& k
这个语句将一个或多个数据列标记为未用数据列,但并不删除数据列中的数据,也不释放占用的磁盘空间。但是,未用数据列在视图和数据字典中并不显示,并且该数据列的名称将被删除,新的数据列可以使用这个名称。基于该数据列的索引、约束,统计等都将被删除。 |