5、数据库“表”相关

表结构
创建表
修改表
表约束

一、表结构:
表中存在5种内置字段数据类型:数值类型、字符类型、日期类型、LOB类型与ROW ID类型。除此还可以自定义类型。

1.1数值类型:整数或浮点数。
number为例:存在可选参数精度precision和范围scale。如:number(9,1),共9位,小数保留一位。若小数位过多则四舍五入


1.2字符类型:
char:定长、范围1-2000字节。长度固定,存储内容少于长度则用空格补充。
varchar2:变长。不会用空格填充。另:对于varchar2 以2000为分界线,<2000则在存储上直接分配足够的空间,而>=2000的

,不会预分配足够的空间。这是oracle出于效率方面的考虑。
1.3日期类型:
sysdate函数获取系统当前日期。
nls_date_format指定日期初始化格式。
1.4LOB类型:
1、BLOB,存储二进制对象。图像、音频、视频。最大存储128TB二进制对象。
2、CLOB,存储字符格式的大型对象。最大存储128MB字符对象。
3、BFILE,将128MB的二进制文件作为操作做系统文件存储这数据库外部,BFILE类型的字段中仅报错二进制文件的指针,并且

4、BFILE字段是只读的,不能通过数据库对其中的数据进行修改。

LOB列补充:
1、LOB列根据内容大小不同,采用不同的存储方式,数据小于4KB则内容存储这该LOB列中,如果大于4KB则存储在表的外部。
2、大对象表定义完成后,应该使用初始化函数初始化大对象列。如BLOB,CLOB使用empty_clob()函数和empty_blob()函数进行

初始化(建完表后插入一条数据,大字段使用函数返回值)。

1.5ROW ID类型:
伪列类型(oracle自动为每个表建立ROWID的字段),用于这oracle内存保存表中每条记录的物理地址。

二、创建表
创建表需要create table系统权限,如果要这其他模式中创建表,需要有create any table系统权限。

create table [模式.]table_name(
column_name column_type [not null |default xxx],
...
)[tablespace tablespace_name
storage(initial|next|minextents size )]
[pctfree percent]
[pctused percent]
[initrans numbers]
[logging|nologging]
[nocache|cache]

2.1storage子句用于设置存储参数:
initial:指定第一个盘区大小以KB或者MB为单位,如storage(initial 128kb);(这为已知数量的数据建立表时,可设置其能

够容纳所有数据的数值,这样所有数据都这一个盘区中,从而避免产生碎片)
next:指定下一个(第二个)盘区大小。(该参数仅这字典管理的表空间中起作用,而这本地化管理的表空间中不再起作用)
minextents:指定允许为表中数据所分配的最小盘区数目。(同样,本地化管理的表空间中部再起作用)

2.2数据块管理参数:
pctfree:指定数据块中必须保留的最小空间百分比。 默认10
pctused:设置数据块是否可用的界限。如果已占用的存储空间低于pctused设置的比例,则数据块能够被再次使用。
initrans:指定数据块所允许的并发事务数目(在数据库头部开辟initrans个事务空间,仅用于存储事务条目。)11G中默认最

大支持255个并发事务。超过initrans个事务时,oracle将这数据库空闲空间中为事务分配空间,动态的进行开辟和回收。

2.3指定重做日志:
[logging|nologging] 默认logging即记录数据的改变。
    重做日志记录数据的所有改变,当发生故障导致数据不能从内存报错到数据文件中,就可以从重做日志中获取被操作的数

据,防止数据丢失,提高表中数据的可靠性。
    不指定重做日志,可节省重做日志文件的存储空间,但没有重做日志文件记录对标的操作,可能会无法用数据库恢复操作

来回复丢失的数据。

2.4指定缓存:
[nocache|cache] 默认nocache。
    当oracle中执行全表搜索时,读入缓存的数据块存储这LRU列的最近最少使用端,这意味着再进行查询操作,且必须向缓

存中存储数据时,就会将刚读入的数据块换出。
    建表时使用cache子句改变这种行为。使得执行的全表搜索放置这LRU的最近最常用的一端。一般对于比较小且又经常查询

的表,可以这创建时指定cache子句。

三、修改表
修改表需要有alter table系统权限,修改任何模式中的表则需要alter any table系统权限。

3.1增加字段
alter table table_name add(column_name column_type);

3.2删除字段
alter table table_name drop column column_name; --单个
alter table table_name drop (column_name1,column_name2) --多个,删除多个字段不允许使用column关键字

3.3更新字段
alter table table_name modify column_name type;

3.4修改表名
alter table table_name_old rename to table_name_new; --用户只可以对自己模式中的表进行重命名。

3.5修改存储的表空间
alter table table_name move tablespace tablespace_name; --由于表空间对应的数据文件不同,所以在物理上,数据将会

从一个数据文件移动到另外的数据文件中。
select tablespace_name,table_name from user_tables where table_name = 'table_name'; --查看表所属表空间。

3.6修改表的存储参数
alter table table_name pctfree xx pctused xx; --修改空闲比例和使用比例。
select table_name, pct_free,pct_used from user_tables where table_name = 'table_name'; --查看状态

3.7删除表
drop table table_name [cascade constraints];
删除操作执行如下:
1、删除表中所有记录。
2、从数据字典中删除该表的定义。
3、删除与该表相关的所有索引和触发器。
4、回收为该表分配的存储空间。
5、如果有视图或PL/SQL过程依赖于该表,这些视图或PL/SQL过程将被置于不可用状态。
注1:当使用cascade constraints子句,则会删除所有相关的视图和plsql过程。
注2:一遍情况用户删除表后,并不会马上释放空间,而是将表重命名,放入回收站,当需要还原时,使用flashback table语

句进行还原。如果希望删除时立即释放空间,则这语句中使用purge选项。
select object_name,original_name from recyclebin where original_name = 'table_name'; --查看已删除的表。
flashback table table_name to before drop; --恢复已删除的表

3.8修改表状态
alter table table_name {read only|read write};


四、表约束
oracle约束类型包括:非空约束、主键约束、唯一性约束、外键约束、检查约束和默认约束and so on。

4.1、非空约束
alter table table_name modify salary {not null | null};

4.2、主键约束
alter table table_name add constraint constraint_name primary key(column1[,column2...]); --创建主键约束,并命


alter table table_name add primary key(column1[,column2...]); --创建匿名主键约束
alter table table_name drop constraint constraint_name; --删除约束。
主键:唯一、非空、自动建立索引。

4.3、唯一性约束
alter table table_name add constraint constraint_name unique(column1[,column2]);
alter table table_name drop constraint constraint_name;
唯一约束可以有null值。

4.4、外键约束
alter table table_name1 add constraint constraint_name foreign key(column1) references table_name2(column2)

{on delete|update} {cascade|set null|no action};
alter table table_name drop constraint constraint_name; --删除外键
概念:外键表、外键列、被引用表、被引用列。要区分清楚,顾名思义。
    创建外键约束要求外键列中的数据必须来自被引用列,被引用列中不存在的数据不能存储在外键列中。一般情况下,当删

除被引用表中的数据时,该数据也不能出现这外键列中,如果外键列存储了将要在被引用表中删除的数据,那么对被引用表的

删除数据的操作将失败(因为默认引用类型为no action)
注:这一个表上创建外键约束时,被引用表必须已经存在,并且必须为该表的被引用列定义唯一性约束或主键约束。
cascade:当被引用表的被引用列删除时,外键表中的对应数据也删除。
set null:被引用表的引用列删除时,外键表的列被设置为null(同时要求外键列支持null值)。
no action:默认的类型,当执行删除被引用列时,该操作被禁止。

4.5、禁止和激活约束
alter table table_name {disable|enable[ novalidate|validate]} constraint constraint_name;
disable:禁用约束,可以与关键字cascade联合使用,进行级联禁用。否则需要先禁用与之关联的外键。
enable:激活约束,可选项novalidate即激活时,不对现有的数据进行约束验证,默认是validate进行验证。

alter table table_name disable constraint constraint_name keep index;
当禁用主键约束时,会默认删除约束的唯一索引,在重新激活时再重新建立唯一索引。通过keep index关键字保留禁用主键时

的索引。

4.6、删除约束
alter table table_name drop constraint constraint_name;







你可能感兴趣的:(oracle,数据库,约束,表)