ORACLE基本数据类型(亦叫内置数据类型 built-in datatypes)能够按类型分为:字符串类型、数字类型、日期类型、LOB类型、LONG RAW& RAW类型、ROWID & UROWID类型。
在讲叙字符串类型前,先要讲一下编码。字符串类型的数据可依编码方式分成数据库字符集(CHAR/VARCHAR2/CLOB/LONG)和国际字符集(NCHAR/NVARCHAR2/NCLOB)两种。数据库中的字符串数据都通过字符集将字符转换为数字后(二进制)。才存储到数据块中。
通过不同的编码集转换,即便是同样的字符,也可能会转换成不同的二进制编码。
这也是产生乱码的原因。
数据库的编码格式通常是在创建数据库时指定的。
当然也能够改动数据库的编码。
查看数据库视图所包括的数据类型:SELECT * FROM DBA_TYPES WHERE OWNER IS NULL.详细细节情况參见Oracle?
Database SQL Language Quick Reference 10/11g 或官方文档
一 字符串类型
字符串数据类型还能够根据存储空间分为固定长度类型(CHAR/NCHAR) 和可变长度类型(VARCHAR2/NVARCHAR2)两种.
所谓固定长度:是指尽管输入的字段值小于该字段的限制长度,可是实际存储数据时,会先自己主动向右补足空格后,才将字段值的内容存储到数据块中。这样的方式尽管比較浪费空间。可是存储效率较可变长度类型要好。同一时候还能降低数据行迁移情况发生。
所谓可变长度:是指当输入的字段值小于该字段的限制长度时。直接将字段值的内容存储到数据块中。而不会补上空白。这样能够节省数据块空间。
1.1:CHAR类型 CHAR(size [BYTE | CHAR])
CHAR类型,定长字符串,会用空格填充来达到其最大长度。非NULL的CHAR(12)总是包括12字节信息。CHAR字段最多能够存储2,000字节的信息。假设创建表时,不指定CHAR长度,则默觉得1。
另外你能够指定它存储字节或字符,比如 CHAR(12 BYTYE) CHAR(12 CHAR).一般来说默认是存储字节,你能够查看数据库參数
注意:数据库的NLS_CHARACTERSET 为AL32UTF8。即一个汉字占用三到四个字节。假设NLS_CHARACTERSET为ZHS16GBK。则一个字符占用两个字节。假设串的长度小于或等于250(0x01~0xFA)。 Oracle 会使用1 个字节来表示长度。对于全部长度超过250 的串,都会在一个标志字节0xFE 后跟有两个字节来表示长度。因此,假设有一个包括“Hello World”的VARCHAR2(80)。则在块中可能如图12.-1 所看到的
clip_image002
1.2: NCHAR类型
这是一个包括UNICODE格式数据的定长字符串。
NCHAR字段最多能够存储2,000字节的信息。
它的最大长度取决于国家字符集。另外查询时,假设字段是NCHAR类型,则须要例如以下书写
SELECT translated_description FROM product_descriptions
WHERE translated_name = N'LCD Monitor 11/PM';
1.3 VARCHAR类型
不要使用VARCHAR数据类型。
使用VARCHAR2数据类型。
尽管VARCHAR数据类型眼下是VARCHAR2的同义词,VARCHAR数据类型将计划被又一次定义为一个单独的数据类型用于可变长度的字符串相比,具有不同的比較语义。
1.4: VARCHAR2类型
变长字符串,与CHAR类型不同,它不会使用空格填充至最大长度。VARCHAR2最多能够存储4,000字节的信息。
1.5: NVARCHAR2类型
这是一个包括UNICODE格式数据的变长字符串。 NVARCHAR2最多能够存储4,000字节的信息。
二. 数字类型
2.1 NUMBER类型
NUMBER(P,S)是最常见的数字类型,能够存放数据范围为10^130~10^126(不包括此值),须要1~22字节(BYTE)不等的存储空间。
P 是Precison的英文缩写,即精度缩写。表示有效数字的位数,最多不能超过38个有效数字
S是Scale的英文缩写。能够使用的范围为-84~127。Scale为正数时,表示从小数点到最低有效数字的位数。它为负数时,表示从最大有效数字到小数点的位数
2.2 INTEGER类型INTEGER是NUMBER的子类型。它等同于NUMBER(38,0),用来存储整数。若插入、更新的数值有小数,则会被四舍五入。
比如:
CREATE TABLE TEST
(
ID INTEGER
)
查看表TEST的DDL定义例如以下所看到的
CREATE TABLE "SYS"."TEST"
( "ID" NUMBER(*,0)
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "SYSTEM" ;
INSERT INTO TEST
SELECT 12.34 FROM DUAL;
INSERT INTO TEST
SELECT 12.56 FROM DUAL;
SQL> SELECT * FROM TEST;
ID
----------
12
13
2.3 浮点数
浮点数能够有一个十进制数点不论什么地方从第一个到最后一个数字。或者能够在全部有没有小数点。指数可能(可选) 用于下面数量添加的范围 (比如。 1.777e-20)。刻度值不适用于浮点数字,由于能够显示在小数点后的位数的数量不受限制。
二进制浮点数不同数量的值由 Oracle 数据库内部存储的方式。
使用小数精度数存储值。全然同样号码存储范围和数量由支持的精度内的全部文本。正是由于使用小数精度(数字 0 到 9) 表示文本存储文本。使用二进制精度 (数字 0 和 1) 存储二进制浮点数。这种存储方案不能代表全部确切地使用小数精度的值。频繁地。将值从十进制转换为二进制的精度时出现的错误时撤消值回从二进制转换为十进制精度。在字面 0.1 是一个这种样例。
Oracle 数据库提供了专为浮点数的两种数值数据类型:
BINARY_FLOAT
BINARY_FLOAT 是 32 位、 单精度浮点数字数据类型。能够支持至少6位精度,每一个 BINARY_FLOAT 的值须要 5 个字节,包含长度字节。
BINARY_DOUBLE
BINARY_DOUBLE 是为 64 位,双精度浮点数字数据类型。每一个 BINARY_DOUBLE 的值须要 9 个字节,包含长度字节。
在数字的列中。浮点数有小数精度。在 BINARY_FLOAT 或 BINARY_DOUBLE 的列中,浮点数有二进制的精度。二进制浮点数支持的特殊值无穷大和 NaN (不是数字)。
您能够指定列在表 2-4 范围内的浮点数。"数字文本"中定义了用于指定浮点数的格式。
Table 2-3 Floating Point Number Limits
Value Binary-Float Binary-DoubleMaximum positive finite value
3.40282E+38F 1.79769313486231E+308Minimum positive finite value
1.17549E-38F 2.22507485850720E-3082.5 FLOAT类型
FLOAT类型也是NUMBER的子类型。
Float(n),数 n 指示位的精度,能够存储的值的数目。
N 值的范围能够从 1 到 126。若要从二进制转换为十进制的精度,请将 n 乘以 0.30103。要从十进制转换为二进制的精度,请用 3.32193 乘小数精度。126 位二进制精度的最大值是大约相当于 38 位小数精度。
三. 日期类型
日期类型用于存储日期数据。可是并非使用一般的格式(2012-08-08)直接存储到数据库的。
3.1 DATE类型
DATE是最经常使用的数据类型,日期数据类型存储日期和时间信息。
尽管能够用字符或数字类型表示日期和时间信息,可是日期数据类型具有特殊关联的属性。
为每一个日期值,Oracle 存储下面信息: 世纪、 年、 月、 日期、 小时、 分钟和秒。一般占用7个字节的存储空间。
3.2 TIMESTAMP类型
这是一个7字节或12字节的定宽日期/时间数据类型。它与DATE数据类型不同,由于TIMESTAMP能够包括小数秒。带小数秒的TIMESTAMP在小数点右边最多能够保留9位
3.3 TIMESTAMP WITH TIME ZONE类型
这是TIMESTAMP类型的变种。它包括了时区偏移量的值
3.4 TIMESTAMP WITH LOCAL TIME ZONE类型
3.5 INTERVAL YEAR TO MOTH
3.6 INTERVAL DAY TO SECOND
四. LOB类型
内置的LOB数据类型包含BLOB、CLOB、NCLOB、BFILE(外部存储)的大型化和非结构化数据。如文本、图像、视屏、空间数据存储。BLOB、CLOB、NCLOB类型
4.1 CLOB 数据类型
它存储单字节和多字节字符数据。支持固定宽度和可变宽度的字符集。CLOB对象能够存储最多 (4 gigabytes-1) * (database block size) 大小的字符
4.2 NCLOB 数据类型
它存储UNICODE类型的数据。支持固定宽度和可变宽度的字符集。NCLOB对象能够存储最多(4 gigabytes-1) * (database block size)大小的文本数据。
4.3 BLOB 数据类型
它存储非结构化的二进制数据大对象,它能够被觉得是没有字符集语义的比特流,通常是图像、声音、视频等文件。BLOB对象最多存储(4 gigabytes-1) * (database block size)的二进制数据。
4.4 BFILE 数据类型
二进制文件,存储在数据库外的系统文件。仅仅读的。数据库会将该文件当二进制文件处理
五. RAW & LONG RAW类型
5.1 LONG类型
它存储变长字符串,最多达2G的字符数据(2GB是指2千兆字节, 而不是2千兆字符),与VARCHAR2 或CHAR 类型一样,存储在LONG 类型中的文本要进行字符集转换。ORACLE建议开发中使用CLOB替代LONG类型。支持LONG 列仅仅是为了保证向后兼容性。
CLOB类型比LONG类型的限制要少得多。 LONG类型的限制例如以下:
1.一个表中仅仅有一列能够为LONG型。
(Why?有些不明确)
2.LONG列不能定义为主键或唯一约束。
3.不能建立索引
4.LONG数据不能指定正則表達式。
5.函数或存储过程不能接受LONG数据类型的參数。
6.LONG列不能出如今WHERE子句或完整性约束(除了可能会出现NULL和NOT NULL约束)
用于存储二进制或字符类型数据,变长二进制数据类型。这说明採用这样的数据类型存储的数据不会发生字符集转换。
这样的类型最多能够存储2,000字节的信息
六. ROWID & UROWID类型
在数据库中的每一行都有一个地址。然而。一些表行的地址不是物理或永久的,或者不是ORACLE数据库生成的。
比如,索引组织表行地址存储在索引的叶子,能够移动。
比如,外部表的ROWID(如通过网关訪问DB2表)不是??
标准的ORACLE的rowid。
ORACLE使用通用的ROWID(UROWIDs)的存储地址的索引组织表和外表。索引组织表有逻辑urowids的,和国外表的外urowids,。UROWID这两种类型的存储在ROWID伪(堆组织的表的物理行id)。
创建基于逻辑的rowid在表中的主键。逻辑的rowid不会改变。仅仅要主键不改变。索引组织表的ROWID伪UROWID数据类型。你能够訪问这个伪列,你会堆组织表的ROWID伪(即使用一个SELECT ...ROWID语句)。假设你想存储的rowid索引组织表,那么你就能够定义一列的表型UROWID到列检索值的ROWID伪。
表约束
Oracle约束操作
约束是在表中定义的用于维护数据库完整性的一些规则。通过为表中的字段定义约
束,能够防止将错误的数据插入到表中。
注意:
1.假设某个约束仅仅作用于单独的字段,既能够在字段级定义约束,也能够在表级定义约束;但假设某个约束将作用于多个字段。必须在表级定义约束。
2.oracle中的约束通过名称来进行识别。
在定义约束时能够通过constraintkeyword为约束命名。
假设用户没有为约束指定名称,oracle将自己主动为约束建立默认的名称。
主键约束(primary key):
主键约束的特点:
定义为主键约束的字段中不能包括不论什么反复值。而且不能包括null值。
同1个表中仅仅能定义1个主键约束。
能够为一个字段定义主键约束,也能够为多个字段的组合定义主键约束。
oracle会自己主动为具有主键约束的字段建立1个唯一索引和1个非空约束。
比如:
create table person
(
p_id int primary key, --定义该字段为主键约束
p_name varchar2(20),
p_age int
--constraint p_pk primary key (p1_id)
);
create table person
(
p_id int constraint p_pk primary key, --定义该字段为主键约束。并指定约束名字
p_name varchar2(20),
p_age int
--constraint p_pk primary key (p1_id)
);
create table person
(
p_id int,
p_name varchar2(20),
p_age int,
constraint p_pk primary key (p_id,p_name)--定义复合主键,并指定名字
--primary key(p_id,p_name)
);
非空约束(not null):
非空约束的特点:
定义了非空约束的字段中不能包括null值。
仅仅能在字段级定义非空约束。
在同一个表中能够定义多个非空约束。
比如:
create table person
(
p_id int,
p_name varchar2(20) not null, --定义该列的非空约束
p_age int
);
唯一约束(unique):
唯一约束的特点:
定义了唯一约束的字段中不能包括反复值。
能够为1个字段定义唯一约束,也能够为多个字段的组合定义唯一约束。因此,唯一约束既能够定义在字段级,也能够定义在表级。
oracle会自己主动为具有唯一约束的字段建立1个唯一索引。
对同一字段能够同一时候定义非空和唯一约束。
假设在1个字段上仅定义了唯一约束,而未定义非空约束,则该字段能够包括多个null值。
比如:
create table person
(
p_id int,
p_name varchar2(20) unique,--定义该列的唯一约束
p_age int
);
create table person
(
p_id int,
p_name varchar2(20) constraint p_un unique not null, --同一时候定义唯一和非空约束
p_age int
);
create table person
(
p_id int,
p_name varchar2(20),
p_age int,
constraint p_un unique(p_name) --指定约束名字
);
外键约束(foreign key)
外键约束的特点:
定义为外键约束的字段中仅仅能包括对应的其它表中引用字段的值或null值。
能够为1个字段定义外键约束。也能够为多个字段的组合定义外键约束。
定义了外键约束的字段和对应的引用字段能够存在于同1个表中,称为自引用。
对同1个字段能够同一时候定义外键和非空约束。
主表中的被引用列。必须有主键约束或唯一约束。
比如:
create table person
(
p_id int,
p_name varchar2(20),
p_age int,
w_id int,
constraint p_fk foreign key (w_id) references works(w_id) --外键约束
);
create table person
(
p_id int,
p_name varchar2(20),
p_age int,
w_id int constraint p_fk references works-- 外键约束。引用works表中的主键
);
create table person
(
p_id int,
p_name varchar2(20),
p_age int,
w_id int references works --外键约束
-- w_id int constraint w_fk references works(w_id)
);
在定义外键约束时,还能够通过onkeyword来指定引用行为的类型。当主表中的一条记录被删除时。须要通过引用行为来确定怎样处理子表中的外键列的值。
删除子表中全部相关的记录(delete cascade),
将全部相关记录的外键值设置为null(delete set null)
检查约束(check)
检查约束的特点:
在检查约束的表达式中必须引用到表中的一个或多个字段,而且表达式的计算结果必须是一个布尔值。
在表达式中不能包括子查询。
在表达式中不能包括sysdate,uid,user,userenv等sql函数,也不能包括rowid,rownum等伪列。
检查约束能够在字段级和表级定义。
对同一个字段能够定义多个检查约束。并且对同一个字段能够同一时候定义检查约束和非空约束。
比如:
create table person
(
p_id int,
p_name varchar2(20),
p_age int check(p_age > 20) --检查约束
-- constraint p_check check(p_age > 20) --检查约束
);
create table person
(
p_id int,
p_name varchar2(20),
p_age int constraint p_check check(p_age > 20) --检查约束
-- constraint p_check check(p_age > 20) --检查约束
);
添加约束
假设添加UNIQUE、PRIMARY KEY、FOREIGN KEY 和CKECK 必须使用ALTER TABLE语句的ADD子句;
假设添加NOT NULL约束。那么必须使用ALTER TABLE语句的MODIFY子句,如:
ALTER TABLE table_name ADD [CONSTRAINT constraint_name]
constraint_type (column,...)
ALTER TABLE table_name MODIFY column
[CONSTRAINT constraint_name] NOT NULL;
加入外键约束
alter table emp add foreign key (deptno) references dept(deptno);
alter table emp add constraint d_fk foreign key (deptno) references dept(deptno);
加入主键约束
alter table table_name add primary key(column_name);
alter table table_name add constraint t_pk primary key(column_name);
加入非空约束
alter table person modify p_name not null;
alter table person modify p_name constraint t_notnull not null;
约束延迟(在事务提交时再验证。默觉得不延迟)
deferrable --延迟验证
not deferrable --不延迟验证(默认)
单独deferrable的含义就是是否同意约束检查延后进行。单独设置deferrable为deferrable之后,约束检查延后是不能够直接使用的。要配合deferred參数。假设该參数是immediate,那么约束还是在DML的时候进行应用。假设deferred參数设置为deferred,约束就是在事务commit提交的时候应用,出现错误就连带回滚rollback整个事务
创建约束时,可指定开启延迟
create table tt
(
id int primary key deferrable initially deferred
);
set constraints 约束名 immediate; 关闭约束延迟
set constraints 约束名 deferred; 开启约束延迟
也能够在session级设置
alter session set constraints=immediate;
alter session set constraints=deferred;
重命名约束
alter table 表名 rename constraint 原约束名 to 新约束名
删除约束
alter table 表名 drop constraint 约束名;
alter table 表名 drop constraint 约束名 cascade; -?-删除主键时级联删除子表的外键约束
约束失效
alter table 表名 disable constraint 约束名
alter table 表名 disable constraint 约束名cascade; --失效主键时级联删除子表的外键约束
约束生效
alter table 表名 enable constraint 约束名
novalidate: --不验证老数据
validate:--验证老数据
控制现有数据是否应用约束。比如
alter table t2 deferrable enable novalidate constraint SYS_C007211; -- 约束生效,不验证已有数据是否符合约束条件
alter table t2 enable validate constraint SYS_C007211; -- 约束生效,同一时候验证已有数据是否符合约束条件
alter table t2 disable validate constraint SYS_C007211;
--约束失效,同一时候验证已有数据是否符合约束条件,之后不能对该表进行dml操作,否则会报ORA-25128错误
alter table t2 disable novalidate constraint SYS_C007211;
-- 约束失效,不验证已有数据是否符合约束条件(默认)
注:约束生效(enable)后的操作都受约束的限制。
查询约束信息
视图名字 描写叙述all_constraints 包括全部的约束基本描写叙述信息,包括约束的名字、类型、状态、延迟性等信息
dba_constraints
user_constraints
all_cons_columns 包括定义课约束的字段信息,利用这个视图能够查看约束定义在哪些字段上
dba_cons_columns
user_cons_columns
索引
在oracle中。索引是一种供server在表中高速查找一个行的数据库结构。
在数据库中建立索引主要有下面作用。
(1)高速存取数据。 (2)既能够改善数据库性能。又能够保证列值的唯一性。 (3)实现表与表之间的參照完整性 (4)在使用orderby、groupby子句进行数据检索时。利用索引能够降低排序和分组的时间。索引使用原则
在关系数据库中,每一行都由一个行唯一标识RowID。RowID包括该行所在的文件、在文件里的块数和块中的行号。
索引中包括一个索引条目,每个索引条目都有一个键值和一个RowID,当中键值能够是一列或者多列的组合。
(一)索引按存储方法分类。能够分为2类:B*树索引和位图索引。 (1)B*树索引的存储结构类似书的索引结构,有分支和叶两种类型的存储数据块。分支块相当于书的大文件夹,叶块相当于索引到的详细的书页。Oracle用B*树机制存储索引条目,以保证用最短路径訪问键值。默认情况下大多使用B*树索引。该索引就是通常所见的唯一索引、逆序索引。 (2)位图索引存储主要用于节省空间。降低oracle对数据块的訪问。它採用位图偏移方式来与表的行ID号相应,採用位图索引通常是反复值太多的表字段。位图索引之所以在实际密集型OLTP(联机事物处理)中用的比較少,是由于OLTP会对表进行大量的删除、改动、新建操作。Oracle每次进行操作都会对要操作的数据块加锁。以防止多人操作easy产生的数据库锁等待甚至死锁现象。在OLAP(联机分析处理)中应用位图有优势,由于OLAP中大部分是对数据库的查询操作,并且一般採用数据仓库技术,所以大量数据採用位图索引节省空间比較明显。
当创建表的命令中包括有唯一性keyword时。不能创建位图索引,创建全局分区索引时也不能用位图索引。
(二)索引按功能和索引对象分还有下面类型。 (1)唯一索引意味着不会有两行记录同样的索引键值。唯一索引表中的记录没有RowID,不能再对其建立其它索引。在oracle10g中。要建立唯一索引,必须在表中设置主keyword,建立了唯一索引的表仅仅依照该唯一索引结构排序。 (2)非唯一索引不正确索引列的值进行唯一性限制。 (3)分区索引是指索引能够分散地存在于多个不同的表空间中。其长处是能够提高数据查询的效率。 (4)未排序索引也称为正向索引。Oracle10g数据库中的行是按升序排序的,创建索引时不必指定对其排序而使用默认的顺序。 (5)逆序索引也称反向索引。该索引相同保持列按顺序排列,可是颠倒已索引的每列的字节。 (6)基于函数的索引是指索引中的一列或者多列是一个函数或者表达式,索引依据函数或表达式计算索引列的值。能够将基于函数的索引建立创建成位图索引。 另外,依照索引所包括的列数能够把索引分为单列索引和复合索引。索引列仅仅有一列的索引为单列索引,对多列同一时候索引称为复合索引。
3索引使用原则编辑
在正确使用索引的前提下,索引能够提高检索对应的表的速度。
当用户考虑在表中使用索引时。应遵循下列一些基本原则。
(1)在表中插入数据后创建索引。在表中插入数据后,创建索引效率将更高。假设在装载数据之前创建索引,那么插入每行时oracle都必须更改索引。
(2)索引正确的表和列。假设常常检索包括大量数据的表中小于15%的行,就须要创建索引。为了改善多个表的相互关系,常用索引列进行关系连接。 (3)主键和唯一keyword所在的列自己主动具有索引,但应该在与之关联的表中的外部keyword所在的列上创建索引。 (4)合理安排索引列。在createindex语句中,列的排序会影响查询的性能,通常将最经常使用的列放在前面。创建一个索引来提高多列的查询效率时,应该清楚地了解这个多列的索引对什么列的存取有效,对什么列的存取无效。 比如:在A,B,C三列上创建索引 A有效 AB有效 ABC有效 (5)限制表中索引的数量。虽然表能够有随意数量的索引。但是索引越多,在改动表中的数据时对索引做出对应更改的工作量也越大,效率也就越低。相同。眼下不用的索引应该及时删除。 (6)指定索引数据块空间的使用。创建索引时。索引的数据块是用表中现存的值填充的,直到达到PCTFREE为止。假设打算将很多行插入到被索引的表中,PCTFREE就应设置得大一点,不能给索引指定PCTUSED。
(7)依据索引大小设置存储參数。创建索引之前应先预计索引的大小,以便更好地促进规划和管理磁盘空间。单个索引项的最大值大约是数据块大小的一半。
簇和簇表
簇事实上就是一组表,是一组共享同样数据块的多个表组成。 将常常一起使用的表组合在一起成簇能够提高处理效率。
在一个簇中的表就叫做簇表。建立顺序是:簇→簇表→数据→簇索引
1、创建簇的 格式
CREATE CLUSTER cluster_name
(column date_type [,column datatype]...) [PCTUSED 40 | integer] [PCTFREE 10 | integer] [SIZE integer] [INITRANS 1 | integer] [MAXTRANS 255 | integer] [TABLESPACE tablespace] [STORAGE storage]SIZE:指定预计平均簇键,以及与其相关的行所需的字节数。
2、创建簇
create cluster my_clu (deptno number )
pctused 60
pctfree 10
size 1024
tablespace users
storage (
initial 128 k
next 128 k
minextents 2
maxextents 20
);
3、创建簇表create table t1_dept(
deptno number ,
dname varchar2 ( 20 )
)
cluster my_clu(deptno);
create table t1_emp(
empno number ,
ename varchar2 ( 20 ),
birth_date date ,
deptno number
)
cluster my_clu(deptno);
4、为簇创建索引create index clu_index on cluster my_clu;
注:若不创建索引。则在插入数据时报错:ORA-02032: clustered tables cannot be used before the cluster index is built管理簇
使用ALTER改动簇属性(必须拥有ALTER ANY CLUSTER的权限)
1、改动簇属性
能够改动的簇属性包含:
* PCTFREE、PCTUSED、INITRANS、MAXTRANS、STORAGE
* 为了存储簇键值全部行所需空间的平均值SIZE
* 默认并行度
注:
* 不能改动INITIAL和MINEXTENTS的值
* PCTFREE、PCTUSED、SIZE參数改动后适用于全部数据块
* INITRANS、MAXTRANS仅适用于以后分配的数据块
* STORAGE參数改动后仅影响以后分配给簇的盘区
格式:
alter cluster my_clu
pctused 40
2、删除簇drop cluster my_clu; -- 仅适用于删除空簇
drop cluster my_clu including tables ; -- 删除簇和簇表
drop cluster my_clu including tables cascade constraints ;
-- 同一时候删除外键约束
注:簇表能够像普通表一样删除。
散列聚簇表
在簇表中,Oracle使用存储在索引中的键值来定位表中的行,而在散列聚簇表中,使用了散列函数取代了簇索引,先通过内部函数或者自己定义的函数进行散列计算,然后再将计算得到的码值用于定位表中的行。创建散列簇须要用到HASHKEYS子句。
1、创建散列簇
create cluster my_clu_two(empno number(10) )
pctused 70
pctfree 10
tablespace users
hash is empno
hashkeys 150 ;
说明:* hash is 子句指明了进行散列的列,假设列是唯一的标示行,就能够将列指定为散列值
* hashkeys 指定和限制散列函数能够产生的唯一的散列值的数量
2、创建散列表
create table t2_emp (
empno number ( 10 ),
ename varchar2 ( 20 ),
birth_date date ,
deptno number )
cluster my_clu_two(empno);
注意:
* 必须设置数值的精度(详细原因不详)
* 散列簇不能也不用创建索引
* 散列簇不能ALTER:size、hashkeys、hash is參数
应用场景126:在Enterprise Manager中创建表
应用情景127:使用CREATE TABLE语句创建表
创建表Employee表
CREATE TABLE HRMAN.Employees
( Emp_id NUMBER, Emp_name VARCHAR2(50) NOT NULL, Sex VARCHAR2(2), Title VARCHAR2(50), Wage NUMBER(8, 2), IdCard VARCHAR2(20), Dep_id NUMBER );