Oracle中表的非常全面的操作

一。创建表

在Oracle数据库中,用户可以根据用户不同的需求创建不同类型的表,常用的表类型有如下:

类型 说明
堆表 数据按照堆组织,一无系方式存放在单独的表字段中,也是标准表,我们平常用的都是堆表。
索引表 数据以B树结构,存放在主键约束所对应的索引段中    
簇表 簇有共享相同数据库的一组表组成。在某些情况下,使用簇表可以节省存储空间。
分区表 数据被划分为更小的部分,并且存储到相应的分区段中,每个分区可以独立管理和操作。

 

1.1 数据类型

数据类型

参数

描述

char(n)

n=1 to 2000字节

定长字符串,n字节长,如果不指定长度,缺省为1个字节长(一个汉字为2字节)

varchar2(n)

n=1 to 4000字节

可变长的字符串,具体定义时指明最大长度n,
这种数据类型可以放数字、字母以及ASCII码字符集(或者EBCDIC等数据库系统接受的字符集标准)中的所有符号。
如果数据长度没有达到最大值n,Oracle 8i会根据数据大小自动调节字段长度,
如果你的数据前后有空格,Oracle 8i会自动将其删去。VARCHAR2是最常用的数据类型。
可做索引的最大长度3209。

number(m,n)

m=1 to 38
n=-84 to 127

可变长的数值列,允许0、正值及负值,m是所有有效数字的位数,n是小数点以后的位数。
如:number(5,2),则这个字段的最大值是99,999,如果数值超出了位数限制就会被截取多余的位数。
如:number(5,2),但在一行数据中的这个字段输入575.316,则真正保存到字段中的数值是575.32。
如:number(3,0),输入575.316,真正保存的数据是575。

date

从公元前4712年1月1日到公元4712年12月31日的所有合法日期,

long

可变长字符列,最大长度限制是2GB,用于不需要作字符串搜索的长串数据,如果要进行字符搜索就要用varchar2类型。

raw(n)

n=1 to 2000

可变长二进制数据,在具体定义字段的时候必须指明最大长度n,Oracle 8i用这种格式来保存较小的图形文件或带格式的文本文件,如Miceosoft Word文档。
raw是一种较老的数据类型,将来会逐渐被BLOB、CLOB、NCLOB等大的对象数据类型所取代。

long raw

可变长二进制数据,最大长度是2GB。Oracle 8i用这种格式来保存较大的图形文件或带格式的文本文件,如Miceosoft Word文档,以及音频、视频等非文本文件。
在同一张表中不能同时有long类型和long raw类型,long raw也是一种较老的数据类型,将来会逐渐被BLOB、CLOB、NCLOB等大的对象数据类型所取代。

blob
clob
nclob

三种大型对象(LOB),用来保存较大的图形文件或带格式的文本文件,如Miceosoft Word文档,以及音频、视频等非文本文件,最大长度是4GB。
LOB有几种类型,取决于你使用的字节的类型,Oracle 8i实实在在地将这些数据存储在数据库内部保存。
可以执行读取、存储、写入等特殊操作。

bfile

在数据库外部保存的大型二进制对象文件,最大长度是4GB。
这种外部的LOB类型,通过数据库记录变化情况,但是数据的具体保存是在数据库外部进行的。
Oracle 8i可以读取、查询BFILE,但是不能写入。
大小由操作系统决定。

我也把这个整理了一份文档,在文章末尾的时候 可以把它download下来!~。

1.2创建表的语法

Create table [schema,] table_name(

column_name data_type [default express] [constraint]

[,column_name data_type [default express] [constraint]]

[,column_name data_type [default express] [constraint]]

);

上面的一些解释,需要明白下,[]表示这在创建表的时候是可选的。而没有[]这个东西表明在创建的时候 是必须要写的!~~~比方说[constraint] 这个给当前列加约束,那么约束是可以加或者不加的!

Scheme:指定表所属的用户名或者所属的用户模式名称。

table_name:顾名思义,就是表名。

column_name:列名

data_type:数据类型,就像在1.1中的写的。

default express:默认值。

constraint:添加列的约束,表示该列必须要满足的规则。

比如:

 

not null表示非空,就是这个字段不能为空。

1.3查看表信息

当我们创建了表之后,可以通过describe(简写desc)进行查看表的结构。如下:

 

这个命令很有用,特别是在我们运用数据字典的时候,因为你刚开始不知道这个数据字典里的字段。

当然,我们还可以通过查询数据字典试图user_tables 来查询表的有关信息!

 

这个只是表明有这个表,那如果要查看表的结构呢,就像和desc一样呢?那么你可以用到user_tab_columns数据字典,如下:

 

1.4指定表的模式

在上面创建表的语法中,有一个是scheme的字段!~,它就是指定表的模式。用来表示所属的用户名或者所属的用户模式名称。如下图:

 

1.4指定重做日志

在创建表的时候,如果使用Logging字句,则表示对表的所有操作都将记录到重做日志中。

 

接着,我们在数据字典里user_tables进行查看 是否果真如此,如下:

 

当然你也可以使用nologging这个,表示不需要日志!~

1.5指定缓存

如果一个用户请求的数据是最近才开始使用的,那么这个数据最有可能存放在缓冲中。那么有人可能会问,在缓冲有什么好处呢?其实,好处是大大滴好。因为在缓冲的话,下次要在次读取数据的话,就不需要从磁盘中读了,直接从缓冲力拿 不是很方便吗?

创建表的时候,可以用cache关键改变这种结果。 哦 对了,Oracle 是使用LRU(least Recently Userd)来管理缓冲的。如果在表的后面加上cache的话,那么Oracle在执行LRU的时候,就不会把这个表相关的数据给换出去。如图:

 

二。修改表

创建了表之后,那当然就需要对表进行维护咯!

2.1增加和删除列

①增加列

语法是:

alter table 表名 add 列名 数据类型

 

②删除列

语法如下:

alter table 表名 drop column 列名

你也可以同时删除几个,那么列名需要用()起来~~

alter table 表名 drop column (列名1,列名2.。。)

比如:alter table mybook3 drop column publicdata; 就把刚的那列删除了。

2.2使用unused

如果对一个表删除大量的数据,由于需要对每个列的记录进行处理,所以删除的速度可能会很慢。这个时候,我们可以使用关键字unused来代替这个操作!~啥意思呢?其实这在用户的角度来说,这个和删除是没有分别的,只是被标记为unused的字段依然留在数据库中,可以想象为被注释了,实质上空间并没有释放。

语法:

alter table 表名 set unused(列名);

 

通过数据字典user_unused_col_tabs可以查看数据中的有哪些字段被标记为unused。

当然 也可以删除这个标记,语法如下:

alter table 表名 drop unused 列名

2.2更新列

 有时候,我们创建了表之后,发现需要对一些字段进行修改,比如更新列名、列的数据类型、数字列的精度以及列的默认值等等。

①修改列名

更新列的语法:

alter table 表名 rename column 老的列名 to 新的列名

 

②修改列的数据类型

在我们修改数据类型的时候,我想要注意2点:

☆在表里有数据的情况下,一般情况下我们无需把数据的长度由短向长的改变,为什么呢?很简单啊,会精度丢失呀!~但是你可以这么做,只是你要知道后果。

☆当表里没数据时,那就可以逆向进行改变了。

语法如下:

alter table 表名 modify 列名 新的数据类型

 

修改列的精度 也是一样道理!

③修改列的默认值

语法如下:

alter table 表名 modify(列名 default 默认值)

2.3重命名表

语法:

alter table 表名 rename to 新表

 

这个很简单。

NOTE;对表进行重命名很简单呢,但是不建议这样用。因为这样做的影响非常的大。虽然Oracle可以自动更新数据字典中表的外键、约束和表关系等,但是还不能更新数据库中的存储代码等等。所以,需要谨慎使用。

2.4删除表定义

如果用户需要删除所创建的表的定义,可以使用如下语法:

drop table 表名 [cascade constraints | purge]

我们需要知道的是删除表定义和删除表数据的区别,

删除表定义,删除表的结构和数据都不存在。

删除表数据,只是删除数据但是结构还在。

在使用drop table语句的时候 ,可以使用如下2个参数:

★cascade constraints

表示在删除表,不仅删除本表,而且删除所有应用这个表的试图、约束等等。因为有些表因为关系(比如外键,这个下个章节会说),所以删除不了,会提示有错,那这个时候你需要使用这个。

我新建2个表:

班级表:myclass

 

学生表:

 

ok,我们有了上面的环境之后,我们往2个表中随便插入一些数据。然后,我现在删除myclass表,结果如下:

 

现在,我们把cascade constraints 这个加上,结果如下:

 

★purge

表示在删除表定义之后,立即释放该表所占用的资源空间。

语法

drop table 表名 purge;

posted @ 2012-10-12 14:42  残阳飞雪  阅读(1051)  评论(0编辑  收藏  举报