Oracle--02对表的基本操作

Oracle对表的基本操作

1、创建表
在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,但是不能写入。
大小由操作系统决定。

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的时候,就不会把这个表相关的数据给换出去。如图:

 
二。修改表
创建了表之后,那当然就需要对表进行维护咯!
添加字段的语法:alter table tablename add (column datatype [default value][null/not null],….);

修改字段的语法:alter table tablename modify (column datatype [default value][null/not null],….);

删除字段的语法:alter table tablename drop (column);
添加、修改、删除多列的话,用逗号隔开。

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可以自动更新数据字典中表的外键、约束和表关系等,但是还不能更新数据库中的存储代码等等。所以,需要谨慎使用。

注意:重点有一个表名为tb,字段段名为name,数据类型nchar(20)。
1、假设字段数据为空,则不管改为什么字段类型,可以直接执行:
alter table tb modify (name nvarchar2(20));

2、假设字段有数据,则改为nvarchar2(20)可以直接执行:
alter table tb modify (name nvarchar2(20));

3、假设字段有数据,则改为varchar2(40)执行时会弹出:“ORA-01439:要更改数据类型,则要修改的列必须为空”,这时要用下面方法来解决这个问题:

/*修改原字段名name为name_tmp*/
alter table tb rename column name to name_tmp;

/*增加一个和原字段名同名的字段name*/
alter table tb add name varchar2(40);

/*将原字段name_tmp数据更新到增加的字段name*/
update tb set name=trim(name_tmp);

/*更新完,删除原字段name_tmp*/
alter table tb drop column name_tmp;

总结:
1、当字段没有数据或者要修改的新类型和原类型兼容时,可以直接modify修改。
2、当字段有数据并用要修改的新类型和原类型不兼容时,要间接新建字段来转移。

2.4删除表定义
如果用户需要删除所创建的表的定义,可以使用如下语法:
drop table 表名 [cascade constraints | purge]
我们需要知道的是删除表定义和删除表数据的区别,
删除表定义,删除表的结构和数据都不存在。

删除表数据,只是删除数据但是结构还在。
在使用drop table语句的时候 ,可以使用如下2个参数:
★cascade constraints

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

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

 现在,我们把cascade constraints 这个加上,结果如下:
purge
表示在删除表定义之后,立即释放该表所占的资源空间。

语法
drop table 表名 purge;

表名应该以字母开头,可以在表名中包含数字,下划线,#和$等。

一、创建表:
第一种:直接创建
create table 表名
(
field1 type[(size)] [index1],
field2 type[(size)] [index2],
......,
[[multifieldindex],...]
)

第二种:从其他表中创建表
create table 表名 as select语句.但是这个select语句如果涉及到long数据类型,就不行了。

创建表时,把较小的不为空的字段放在前面。可以给字段加上约束条件。
添加列     alter table 表名 add 列定义
更改列     alter table 表名 modify (列名 新属性, ......);
删除列     alter table 表名 drop column 列名s [cascade constraint]
             alter table 表名 drop unused colunm
未用列     alter table 表名 set unused column 列名 [cascade constraint]
更改表名  rename 原来表名 to 新表名

create table TestA
(
  NID      NUMBER not null,
  FNAME    VARCHAR2(40),
  PLACE    VARCHAR2(40),
  PRICE    NUMBER,
  a VARCHAR2(10)
)


insert into TestA  values (1,'李达','北京',123,'你好');
insert into TestA  values (2,'浩达','上海',1234,'好');
insert into TestA  values (3,'熊爱华','南京',153,'到好');
insert into TestA  values (4,'离线','吉林',183,'你');
commit;


select * from TestA


增加一列:
alter table TestA add b varchar2(10);
alter table TestA add d varchar2(10);
alter table TestA add e varchar2(10);
删除一列:
alter   table  TestA drop  column  b;


更改字段名:
1.把TestA 中的列 a 改为 c
alter table  TestA rename  column  a to c;  


2.把 TestA 表重命名为 TestB 表
alter table  TestA rename to TestB;


select * from TestB for update
将一列的数据更新到另一列,可以用CAST函数进行数据类型转换
UPDATE 表名 SET 字段名 = CAST(字段名1 AS VARCHAR2(30));

 update TestB set d = cast(price as int);整数
 update TestB set e = price;



-----Oracle修改字段类型和长度语句:
1、假设字段数据为空时,则不管改为什么字段类型,都可以直接执行:
ALTER TABLE tableName modify(columnName 类型);
例如:
alter table TestB modify(f varchar(255));

2、假设字段里有数据,则改为nvarchar2(30)可以直接执行:
alter table TestB modify (e nvarchar2(30));


3、假设字段有数据,则改为varchar2(30)执行时会弹出:"ORA-01439:要更改数据类型,则要修改的列必须为空",
这时要用上面的方法来解决这个问题:
--------修改原字段名 price 为 price_tmp
alter table TestB rename column price to price_tmp;


----------增加一个和原字段名同名的字段name
alter table TestB add price varchar2(40);


--------将原字段 price_tmp 数据更新到增加的字段 price
update TestB set price=trim(price_tmp);


主要讲述Alter table语句的用法,对表进行修改,alter table 语句可以执行以下任务:
1、添加、修改或删除列
2、添加或删除约束
3、启用或禁用约束
一、添加列(alter table table_name add 列名 类型)
⑴、向表order_status2添加一个名为modified_by的列,类型为integer
SQL>alter table order_status2 add modified_by integer;

向表order_status2添加一个名为initially_created的列,类型为date,默认为sysdate

⑵、SQL>alter table order_status2 add initially_created date default sysdate not null;

二、修改列(alter table table_name modify 列名 ….)
1、修改列的长度,条件是该列的类型的长度可以修改,如:char或varchar2
2、修改数字列的精度
3、修改列的数据类型
4、修改列的默认值
以下将一一举例说明:

⑴修改列的长度
将表order_status2中status列的长度从10增加到20(类型为varchar2)

SQL>alter table order_status2 modify status varchar2(20);

注:只有在表中还没有任何行或所有列都为空值时才可以减小列的长度

⑵修改数字列的精度
将order_status2中id列的精度从40修改为20(类型为number)

SQL>alter table order_status2 modify id number(20);

注:只有在表中还没有任何行或所有列都为空值时才可以减小数字列的精度

⑶修改列的数据类型
将order_status2表中status列的数据类型从varchar2修改为char

SQL>alter table order_status2 modify status char(20);

⑷修改列的默认值

将order_status2表中last_modified列的默认值修改为sysdate-1

SQL>alter table order_status2 modify last_modified default sysdate-1;

⑸删除列
将order_status2表中的initially_creaded列删除
SQL>alter table order_status2 drop column initially_created;

三、添加约束(CHECK、NOT NULL、PRIMARY KEY、FOREIGN KEY、UNIQUE、CHECK OPTION、READ ONLY等)

⑴添加CHECK约束
向表order_status2中status列添加一个check约束

SQL>alter table order_status2 add constraint order_status2_status_chk check (status in (‘PLACED’,’PENDING’,’SHIPPED’));

添加一个ID约束,限制ID的值大于0;
SQL>alter table order_status2 add constraint order_status2_id_chk check (id>0);

⑵添加NOT NULL约束
向order_status2表中status列添加一个NOT NULL约束

SQL>alter table order_status2 modify status constraint order_status2_status_nn not null;

对modified_by 列添加一个NOT NULL约束
SQL>alter table order_status2 modify modified_by constraint order_status2_modified_by_nn not null;

SQL>alter table order_status2 modify last_modified not null;

⑶添加FOREIGN KEY约束
使用alter table首先从order_status2中删除modified_by列,然后添加一个引用employees.employee_id列的FOREIGN KEY约束;

SQL>alter table order_status2 drop column modified_by;

SQL>alter table order_status2 add constraint order_status2_modified_by_fk modified_by references employees(employee_id);

使用一个带有FOREIGN KEY 约束的ON DELETE CASCADE子句,可以指定在父表中删除一行记录时,子表中匹配的所有行也都将被删除

SQL>alter table order_status2 drop column modified_by;

SQL>alter table order_status2 add constraint order_status2_modified_by_fk modified_by references employee(employee_id) on delete cascade;

即当employee表中删除一行记录时,在order_status2表所有匹配的行也都将被删除

SQL>alter table order_status2 add constraint order_status2_modified_by_fk modified_by references employee(employee_id) on delete set null;

即当employee表中删除一行记录时,在order_status2表所有匹配的行也都将被设置为空值

⑷添加UNIQUE约束
向order_status2表的status列添加一个UNIQUE约束

SQL>alter table order_status2 add constraint order_status2_status_uq unique(status);

⑸删除约束
使用alter table的drop constraint子句可以删除约束

SQL>alter table order_status2 drop constraint order_status2_status_uq;

⑹禁用约束
以下是添加一个UNIQUE约束并禁用

SQL>alter table order_status2 add constraint order_status2_status_uq unique(status) disable;

禁用一个现有的约束
SQL>alter table order_status2 disable constraint order_status2_status_nn;

⑺启用约束
以下是启用order_status2_status_uq约束
SQL>alter table order_status2 enble constraint order_status2_status_uq;

通过指定ENABLE NOVALIDATE,可以选择只对新数据应用某个约束

SQL>alter table order_status2 enable novalidate constraint order_status2_status_uq;

⑻延迟约束
延迟约束(deferred constraint)是在事务被提交时强制执行的约束
INITIALLY  IMMEDIATE:是每次向表中添加数据、修改表的数据或删除数据时都要检查这个约束(这与约束的默认行为相同)
INITIALLY  DEFERRED:在事务提交(即执行commit命令)时才会检查约束

SQL>alter table order_status2
add constraint order_status2_status_uq unique(status)
  deferrable initially deferred|immediate;
 
获得相关约束信息
通过查询user_constraints可以获得有关约束的信息
使用all_constraints可以获得所有可以访问的约束的信息

SQL>select constraint_name,constraint_type,status,deferrable,deferred
         From user_constraints
         Where table_name=upper(‘order_status2’);

获得有关列的约束信息
通过查询user_cons_columns可以获得有关列的约束信息
使用all_con_columns可以获得所有可以访问的列的约束信息

SQL>column column_name format a15

SQL>select constraint_name,column_name
        From user_cons_columns
        Where table_name=upper(‘order_status2’);
 
下面是对user_constraints和user_cons_columns进行的联合查询

SQL>select ucc.column_name,ucc.constraint_name,uc.constraint_type,uc.status
        From user_constraints uc,user_cons_columns ucc
        Where uc.table_name=ucc.table_name
        And uc.constraint_name=ucc.constraint_name
        And ucc.table_name=upper(‘order_status2’);

⑼重命名表
SQL>rename order_status2 to order_state;

⑽向表添加注释
以下是向表order_status2添加注释

SQL>comment on table order_status2 is ‘order_status2 stores the of an order’;

以下是向列order_status2.last_modified添加注释

SQL>comment on column order_status2.last_modified is ‘last_modified stores the date and time the order was modified last’;
 
使用user_tab_comments视图获取表的注释

SQL>select * from user_tab_comments where table_name=’ORDER_STATUS2’;

使用user_col_comments视图获取有关列的注释

SQL>select * from user_col_comments where table_name=’ORDER_STATUS2’;

⑾截断表

SQL>truncate table order_status2; (能降低高水位,回收空间,只删除表的数据,不删除此表)

SQL>drop table order_status2;


---更新完,删除原字段 price_tmp
alter table TestB drop column price_tmp;

注意:字段没有数据或修改的新类型和原类型兼容时,可以直接modify修改,否则要新建间接字段来转移

删除表     drop table 表名 [cascade constraints]     删除表后,表上的索引,触发器,权限,完整性约束等都会被删除。

二、表的约束条件
1. check:
确保指定列中的值符合一定条件。check约束可以涉及该行的同属于check约束的其他数据列,但是不能涉及其他行或者其他表。单一的数据列可以有多个check保护,一个check约束可以保护多个数据列。可以在create table时创建check约束,也可以在alter table时修改表的约束。

其语句格式为   constraint [约束名] check(codition). 约束名不是必须的,但是最好有一个名字。下面是一个check约束的例子:
create table 表名
(
a1 int constraint chka1 check (a1 in (1,0)),
a2 int
)
或者
alter table 表名 add constraint(s) chka1 check(a1 in (1,0));
alter table 表名 disable/enable/drop constraint(s) chka1;

2. not null:
它作用在单一数据列上,保证数据列必须要有数据值。当not null是在alter table时才添加上时,写法有所不同:
create table 表名
(

a1 int not null,
a2 int
)
alter table 表名 modify a2 not null

3. unique:
保证那些具有惟一性但又不是主键的一部分列的唯一性。可以保护多个列,唯一性约束与表一起创建,可以用alter table语句修改它:
create table 表名
( a1 int unique,
a2 int)
alter table 表名 add constraints 约束名 unique(列名s)
alter table 表名 disable /enable/ drop constraint(s) 约束名
不能删除带有外键指向的表的唯一性约束,除非先禁用或者删除了外键。删除或者禁用唯一性约束通常会同时删除相关联的唯一索引,降低性能,要避免这种情况,可以在唯一性约束保护的数据列上先创建非唯一性索引,再添加唯一性约束。

4. primary key:
是表中的一列或者多列,决定表中每个行的唯一性,主键列必须是not null。如果是复合主键,要放入括号中。比如:
create table 表名
(
stuid int,
courseid int,
primary key(列名1, 列名2, ......),
score float
)

alter table 表名 add constraints 主键名 primary key (列名s)
alter table 表名 drop/disable/enable primary key(或者用名字);   

5. foreign key:
下面是一个例子:
create table a               create table b
(                                   (
a1 int primary key,       b1 int primary key,
a2 int not null,              b2 int not null,
a3 int unique                )
)

create table c
(
ca int,
cb int,
primary key(ca, cb),
constraint 外键名1 foreignkey(本表列1) references 其他表(其他表中对应列),
constraint 外键名2 foreignkey(本表列2) references 其他表(其他表中对应列)
)
alter table 表名 add constraints 外键名 foreign key(本表列名) references 其他表(其他表中对应列);
alter table 表名 disable/enable/drop constraints 外键名


1、复制表结构(不复制数据):
create table 临时表名称 as select * from 源表名称 where 1=2;
例如:
create table TEMP_SYS_USER as select * from SYS_USER where 1=2;
commit;

2、复制表结构(同时复制数据):
create table 临时表名称 as select * from 源表名称;
例如:
create table TEMP_SYS_USER as select * from SYS_USER;
commit;

3、设置某列值(所有记录该列值都相同):
update 表名 set 表名.列名=要设置的值(若是字符串,格式为:'具体值');
例如:
update TEMP_SYS_USER set TEMP_SYS_USER.USR_FLAG=1;
commit;

4、设置某列值(按条件设置):
update 表名 set 表名.列名=要设置的值(若是字符串,格式为:'具体值')where 条件;
例如:
update TEMP_SYS_USER set TEMP_SYS_USER.USR_FLAG=1 where TEMP_SYS_USER.USR_ID>187;
commit;

5、以插入的方式将table2中的数据插入到table1中(相当于两表合并)
insert into table1 select * from table2 ;
commit;

6、删除零时表:
drop table TEMP_SYS_USER;
commit;

 7、设置时间类型数据:
update table1 set table1.djrq=to_date('1977-01-01','yyyy-mm-dd')
where table1.shiyongbumen='一队' and table1.djrq is null;

 

8、查询有重复字段的记录:
Select * From 表 Where 重复字段 In (Select 重复字段 From 表 Group By 重复字段 Having Count(*)>1);


9、查询表中主键字段的最大值:
SELECT MAX(主键字段) FROM 表;
 
(1)创建表的基本语法如下:
 
Sql代码  
create table tableName(columnName dataType [default expression][column columnStraint],...n) [tablespace tableSpaceName]  
 

(2)修改表的基本语法如下:
 
Java代码  
alter table tableName  
[add(columnName dataType [default expression][column columnStraint],...n)] --添加列  
[modify(columnName [dataType][default expression][columnStraint],...n)] --修改列  
[drop drop_clause] --删除列或约束条件 drop column columnName  
 

(3)删除表的语法:drop table tableName.
 
(4)在往表中插入记录时,如果需要插入某列的值为空,则值必须置为null,如果列值指定为该列的默认值,则用default。
 
(5)merge语句,使用该语句可以实现对表的更新或插入。语法格式如下:
 
Sql代码  
merge into tableName using tableName on(join_condition) when matched then update set...  
    when not matched then insert(...) values(...)  
 
这个语句的意思是把using表合并到into表,合并条件是on(condition),当条件满足时只能是更新into表中的对应的记录,当条件不满足时,则也只能是往into表里面添加对应的数据,而该数据中也只能使用using表中当前记录对应的数据。
示例如下:
假设有一个student表,那么以下语句就可以实现当a的id大于b的id的时候把所有student的年龄加2,否则就新增一条记录。
 
Sql代码  
merge into student a using student b on(a.id>b.id) when matched then update set age=age+2 when not matched then insert(id,name,age,sex,no)   
values(b.id+100,b.name,b.age,b.sex,b.no);  
 

(6)删除表记录之delete和truncate。
delete的语法格式如下:
delete from tableName [where condition] 
该语句的意思是删除tableName表中满足condition条件的记录,当condition省略时则删除表中所有记录。
truncate的语法格式如下:
truncate table tableName
该语句的意思是删除tableName表中的所有记录,使用truncate可以释放占用的数据块表空间。truncate删除是不能回滚的,而delete删除是可以回滚的。正因为如此使用truncate删除所有记录的速度比用delete删除所有记录的速度快。


临时表的特点:
1. 多用户操作的独立性:对于使用同一张临时表的不同用户,ORACLE都会分配一个独立的临时表,这样就避免了多个用户在对同一张临时表操作时发生交叉,从而保证了多个用户操作的并发性和独立性;

2. 数据的临时性:既然是临时表,顾名思义,存放在该表中的数据是临时性的。ORACLE根据你创建临时表时指定的参数(On Commit Delete Rows / On Commit Preserve Rows),自动将数据TRUNCATE掉。

临时表的不足:
1. 不支持lob对象,这也许是设计者基于运行效率的考虑,但实际应用中确实,要此功能时就无法使用临时表了。

2. 不支持主外键关系。
临时表用于何处
在对多表做关联查询时,其中每张表的数据量都比较大,而多表关联后,所得到的结果集确是相当的小且查询的结果的速度比较快,那么这时可以考虑用临时表。

临时表分两种类型的临时表:
1. 会话级临时表
2. 事物级临时表
临时表:顾明思义,存在该表的数据是临时的。

会话临时表:该临时表肯定与会话有关。会话在不退出时,则些临时表中的数据存在,会话退出,该临时表中的数据也会随之消失。在多用户操作的情况下,一个会话从来不阻塞另一个会话使用临时表。即使锁定临时表,一个会话也不会阻塞其他会话使用临时表。其语法为:

Create global temporary table table_name
(col1 type1, col2 type2 …) On commit preserve rows;

示例:
Create global temporary table temp_emp
(empno number(8),
Ename varchar2(30),
Sal    number(8,2)
)
On commit preserve rows;

事物临时表:指该临时表与事务相关,当进行事务提交或者事务回滚的时候,临时表中的数据将自行被截断,其他的内容和会话级的临时表的一致(包括退出SESSION的时候,事务级的临时表也会被自动截断)。语法为:

Create global temporary table table_name
(col1 type1, col2 type2 …)
On commit delete rows;

示例:
Create global temporary table temp_dept
(d_no      number(4),
D_name   varchar2(30),
D_num    number(8)
)
On commit delete rows;



会话临时表和事物临时表的区别:
在语法上,会话临时表采用on commit preserve rows,而事物临时表采用on commit delete rows;在用途上,会话级临时表只会在会话结束时,临时表中的数据才会被截断。而事物临时表则不管是在事物提交(commit)、事物回滚(rollback)或会话结束,临时表中的数据都会被截断。


ORACLE中给表、列增加注释以及读取注释
1、给表填加注释:SQL>comment on table 表名 is '表注释";

2、给列加注释:SQL>comment on column 表.列 is '列注释';

3、读取表注释:SQL>select * from user_tab_comments where comments is not null;
4、读取列注释:SQL>select * from user_col_commnents where comments is not null and table_name='表名';
附表USER_TAB_COMMENTS和user_col_comments的结构:
1、user_tab_comments由table_name、table_type和comments三部分组成。

猜你喜欢

转载自zhyp29.iteye.com/blog/2300201