表和视图 : O5 Q" O- I. G1 B
% h) p. q9 j) i1 J! U Oracle中表是数据存储的基本结构。ORACLE8引入了分区表和对象表,ORACLE8i引入了临时表,使表的功能更强大。视图是一个或多个表中数据的逻辑表达式。本文我们将讨论怎样创建和管理简单的表和视图。 3 c$ A0 a) d4 `+ Y8 p
( u3 I6 e U3 l; d7 G* o# y
管理表
) G- S+ V* [/ V! u& L( |5 N, h: t5 c3 X# u
表可以看作有行和列的电子数据表,表是关系数据库中一种拥有数据的结构。用CREATE TABLE语句建立表,在建立表的同时,必须定义表名,列,以及列的数据类型和大小。例如:
) d& S$ {- Z+ G. T6 J; E6 D
" Y, E2 s9 k) ~, @( e& x: E3 N4 t# wCREATE TABLE products
! M: A. B( |+ G* ~# K ( PROD_ID NUMBER(4), 3 [; r- E9 j7 t! }% @# f
PROD_NAME VAECHAR2(20), 1 S# b D# X0 @6 ^: m" A9 G! W. c
STOCK_QTY NUMBER(5,3)
$ f; r$ S& F& z6 F$ }4 b" P ); 3 E% R$ ]8 T) Z1 T- A" k" h
% Z6 ]/ S+ D) i: K 这样我们就建立了一个名为products的表, 关键词CREATE TABLE后紧跟的表名,然后定义了三列,同时规定了列的数据类型和大小。 0 U: [* l7 P7 j
" u$ j( ~: x: b; W- k1 C) {2 r
在创建表的同时你可以规定表的完整性约束,也可以规定列的完整性约束,在列上普通的约束是NOT NULL,关于约束的讨论我们在以后进行。 - S* G: a* d) p
3 j0 A5 U- x+ V1 J 在建立或更改表时,可以给表一个缺省值。缺省值是在增加行时,增加的数据行中某一项值为null时,oracle即认为该值为缺省值。
4 z+ X/ o' Q0 k) S/ p0 {
$ t! E) h6 X& H3 B6 k% `2 a' e 下列数据字典视图提供表和表的列的信息: % N; m8 H6 M, `8 ?0 U
0 V _7 i9 A% l- ^: ^& {& Q . DBA_TABLES . Z' ? f: \* ~
. DBA_ALL_TABLES h: w, n! [6 `3 ] _0 I' Z
. USER_TABLES 1 |1 s! i! Q: C% T$ v
. USER_ALL_TABLES
( V* C4 p! K# v3 O6 J* k* V . ALL_TABLES
! D; |: F& |! T) L . ALL_ALL_TABLES 1 r9 y' ?- ^+ V! U( y
. DBA_TAB_COLUMNS
- x# x% Z- {4 [ . USER_TAB_COLUMNS ) y0 X. A8 d+ F/ A8 M
. ALL_TAB_COLUMNS
" O! G5 Q5 o+ Q$ ^4 r% _* d& j3 p- @% ~* ?. i
表的命名规则 5 d9 l+ n5 d* ~8 _% X
; A. e4 Z. W' j [) J% r+ l 表名标识一个表,所以应尽可能在表名中描述表,oracle中表名或列名最长可以达30个字符串。表名应该以字母开始,可以在表名中包含数字、下划线、#、$等。 y0 a8 m( ~- u. M2 I4 d+ @
# J% o5 I, i8 m' d
从其它表中建立表 0 l( h; t2 d, g8 m+ h
# ]' f( e8 S" b8 K9 R. P
可以使用查询从基于一个或多个表中建立表,表的列的数据类型和大小有查询结果决定。建立这种形式的表的查询可以选择其他表中所有的列或者只选择部分列。在CREATE TABLE语句中使用关键字AS,例如: . Z# ^8 ] b! O& d& e- i8 ^9 G
8 B+ N) f, E3 d9 R( G$ K/ m3 HSQL>CREATE TABLE emp AS SELECT * FROM employee
' x7 g8 Y4 Y$ W }! _0 ?. c/ w, j7 {3 I( F7 } m! t
TABLE CREATED
8 S5 |: e$ b- o! Q$ e
1 t: y% o, c! l3 SSQL> CREATE TABLE Y AS SELECT * FROM X WHERE no=2 9 W( C( z& z* W$ \, G6 _
7 C( U- b) ^: y1 p% c# K 需要注意的是如果查询涉及LONG数据类型,那么CREATE TABLE....AS SELECT....将不会工作。 : Z9 V4 p4 b0 D+ T2 k) B" ~+ w
' R; ]& d1 a3 H' z
更改表定义
5 m0 k9 ^* h! e/ b7 k1 v" v9 J, |! q- g3 t' ?
在建立表后,有时候我们可能需要修改表,比如更改列的定义,更改缺省值,增加新列,删除列等等。ORACLE使用ALTER TABLE语句来更改表的定义 1 Z& V6 n) z* J" h* k$ F
; l3 ^7 y x/ V- K* Z% i
1、增加列 ; Y! k$ e7 \0 b
7 ~3 C M7 d9 ^8 e h+ j
语法: - s; Y4 ]0 r. J+ v
4 C+ Z& L+ D% tALTER TABLE [schema.] table_name ADD column_definition ' y; s2 b% o; x* N
5 F1 R4 {7 f+ _1 T A! S- L 例:
# G8 F! b3 b; s& e" Z1 |* o6 r7 P9 a) N. q' M! ?7 z
ALTER TABLE orders ADD order_date DATE; ! _ h+ q' J+ C0 h8 t
; J, V" ?" f6 [# gTABLE ALTER
m) Z; W( C4 x$ q& Q0 c# F9 d
% T9 h( w5 v+ A 对于已经存在的数据行,新列的值将是NULL.
; Z7 e, p2 s7 w" `+ @$ M/ v! z 2、更改列
: o( Q4 w7 K) ~; z, L% g3 F: B& b' E6 o& T X
语法:
3 h% W5 x8 e- F7 _' x% \: i% U
: P- [, R: u" `% L2 k) Q/ |8 }ALTER TABLE [schema.] table_name MODIFY column_name new_attributes; & [6 E- ^8 `/ q+ _; z; S9 \# @) L
1 e7 H; y' j d. o* C5 p+ T 例: 1 }+ Z& C4 T6 F( f4 s# Y" c7 M/ n
: u: w6 ]5 I* B4 IALTER TABLE orders MODITY (quantity number(10,3),status varchar2(15));
6 r% A0 p0 j X9 F2 X( z) h4 J, _+ Q8 z
这个例子中我们修改了表orders,将STATUS列的长度增加到15,将QUANTITY列减小到10,3;
% i' ~8 C' |: _ L' p
2 j% P* F* N) z' ^ 修改列的规则如下:
; v4 U8 g& W2 w6 N
- `$ P3 D& p0 c4 M' g . 可以增加字符串数据类型的列的长度,数字数据类型列的精度。 8 c0 _' H* Z# o. t2 l s
3 u3 W% j+ L: _1 A6 ^6 @ . 减少列的长度时,该列应该不包含任何值,所有数据行都为NULL.
+ d6 m7 F6 |, e K) b
0 k4 o, v5 W4 G5 v1 N0 H! ^0 @4 Z$ ^ . 改变数据类型时,该列的值必须是NULL. 7 E0 L" e9 t$ C) E8 Y. r
2 K( m; _' o0 S1 S" x" w . 对于十进制数字,可以增加或减少但不能降低他的精度。
8 v" \5 Y( ]1 C1 U/ q
5 [( I1 [+ A, U) s |