作者:IvanCodes
日期:2025年6月10日
专栏:Oracle教程
这次我们将深入学习如何管理数据库对象的核心——表空间 (Tablespace) 和 表 (Table)。理解如何创建、修改和删除这些对象,是进行有效数据存储和管理的基础。
一、表空间 (Tablespace):数据的逻辑容器
1.1 什么是表空间?
表空间是Oracle数据库中一个重要的逻辑存储结构。它将数据库的物理存储 (即数据文件) 与逻辑对象 (如表、索引) 分离开来。你可以把它想象成一个逻辑上的“文件夹”或“磁盘分区”,数据库对象 (如表) 创建时会被指定存储在某个表空间中。
1.2 表空间的作用:
1.3 创建表空间 (CREATE TABLESPACE)
基本语法格式:
CREATE TABLESPACE tablespace_name
DATAFILE 'datafile_path_and_name' SIZE initial_size
[AUTOEXTEND ON [NEXT increment_size [MAXSIZE max_size | UNLIMITED]]]
[EXTENT MANAGEMENT LOCAL [AUTOALLOCATE | UNIFORM SIZE uniform_extent_size]]
[SEGMENT SPACE MANAGEMENT AUTO | MANUAL];
代码案例:创建一个名为 app_data_ts
的表空间
CREATE TABLESPACE app_data_ts
DATAFILE '/u01/app/oracle/oradata/ORCL/app_data01.dbf' SIZE 100M
AUTOEXTEND ON NEXT 50M MAXSIZE 500M
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
SEGMENT SPACE MANAGEMENT AUTO;
(路径 /u01/app/oracle/oradata/ORCL/
请根据实际环境替换)
1.4 修改表空间 (ALTER TABLESPACE)
代码案例:为 app_data_ts
表空间添加数据文件
ALTER TABLESPACE app_data_ts
ADD DATAFILE '/u01/app/oracle/oradata/ORCL/app_data02.dbf' SIZE 50M;
代码案例:修改 app_data01.dbf
数据文件大小
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/ORCL/app_data01.dbf' RESIZE 200M;
代码案例:设置表空间脱机/联机
ALTER TABLESPACE app_data_ts OFFLINE;
ALTER TABLESPACE app_data_ts ONLINE;
1.5 删除表空间 (DROP TABLESPACE)
语法格式:
DROP TABLESPACE tablespace_name
[INCLUDING CONTENTS [AND DATAFILES]]
[CASCADE CONSTRAINTS];
代码案例:删除 app_data_ts
(假设为空)
DROP TABLESPACE app_data_ts;
代码案例:删除 app_data_ts
及其内容和物理文件
DROP TABLESPACE app_data_ts INCLUDING CONTENTS AND DATAFILES;
二、表 (Table):结构化数据的核心
2.1 创建表 (CREATE TABLE)
基本语法格式:
CREATE TABLE [schema_name.]table_name (
column_name1 datatype [DEFAULT default_value] [column_constraint1 ...],
column_name2 datatype [DEFAULT default_value] [column_constraint2 ...],
...
[table_constraint1, ...]
)
[TABLESPACE tablespace_name]
[storage_clauses ...];
代码案例:创建一个 products
表
CREATE TABLE products (
product_id NUMBER(10) CONSTRAINT pk_product PRIMARY KEY,
product_name VARCHAR2(100) CONSTRAINT nn_product_name NOT NULL,
category_id NUMBER(5),
unit_price NUMBER(8,2) CONSTRAINT ck_product_price CHECK (unit_price >= 0),
supplier_id NUMBER(10),
entry_date DATE DEFAULT SYSDATE,
CONSTRAINT uq_product_name UNIQUE (product_name)
)
TABLESPACE app_data_ts;
2.2 修改表 (ALTER TABLE)
常见操作:
ALTER TABLE products
ADD (stock_quantity NUMBER(5) DEFAULT 0);
ALTER TABLE products
MODIFY (product_name VARCHAR2(150));
ALTER TABLE products
DROP COLUMN supplier_id;
ALTER TABLE products
RENAME COLUMN entry_date TO creation_date;
-- 添加外键 (假设 categories 表和 category_id 主键已存在)
ALTER TABLE products
ADD CONSTRAINT fk_product_category FOREIGN KEY (category_id) REFERENCES categories(category_id);
-- 删除唯一约束
ALTER TABLE products
DROP CONSTRAINT uq_product_name;
RENAME products TO items_inventory;
2.3 删除表 (DROP TABLE)
语法格式:
DROP TABLE [schema_name.]table_name [CASCADE CONSTRAINTS] [PURGE];
代码案例:删除 items_inventory
表
DROP TABLE items_inventory CASCADE CONSTRAINTS;
2.4 清空表 (TRUNCATE TABLE)
语法格式:
TRUNCATE TABLE [schema_name.]table_name [DROP STORAGE | REUSE STORAGE];
代码案例:清空 items_inventory
表 (假设已重命名回来或重新创建了products)
TRUNCATE TABLE products;
本章小结:
本章我们重点学习了Oracle中表空间和表的管理操作。掌握这些DDL语句是构建和维护数据库逻辑结构的核心技能。
练习题 (共10道)
user_data_ts
的表空间,数据文件为 /u02/oradata/DBNAME/user_data01.dbf
(替换DBNAME),初始大小50M,允许自动扩展,每次10M,最大200M。区管理本地自动分配,段空间自动管理。user_data_ts
表空间中创建一张名为 app_users
的表,包含列:user_id
(NUMBER(8), 主键, 约束名 pk_appuser
), username
(VARCHAR2(50), 唯一, 非空, 约束名 uq_appuser_uname
, nn_appuser_uname
), email
(VARCHAR2(100), 唯一, 约束名 uq_appuser_email
), registration_date
(DATE, 默认系统当前日期)。user_data_ts
表空间添加一个新的数据文件 /u02/oradata/DBNAME/user_data02.dbf
,大小20M。app_users
表添加一个新列 last_login_ip
(VARCHAR2(15))。app_users
表的 email
列长度修改为120个字符。app_users
表添加一个名为 ck_appuser_username_len
的检查约束,确保 username
的长度至少为3个字符。app_users
表的 registration_date
列重命名为 join_date
。app_users
表上的唯一约束 uq_appuser_email
。app_users
表的SQL语句,确保它进入回收站 (如果回收站功能开启)。user_data_ts
表空间及其所有内容和物理数据文件的SQL语句 (假设里面可能还有其他对象)。答案与解析:
CREATE TABLESPACE user_data_ts
DATAFILE '/u02/oradata/DBNAME/user_data01.dbf' SIZE 50M
AUTOEXTEND ON NEXT 10M MAXSIZE 200M
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
SEGMENT SPACE MANAGEMENT AUTO;
解析:创建了指定大小、自动扩展参数、区及段管理方式的表空间。
CREATE TABLE app_users (
user_id NUMBER(8) CONSTRAINT pk_appuser PRIMARY KEY,
username VARCHAR2(50) CONSTRAINT uq_appuser_uname UNIQUE CONSTRAINT nn_appuser_uname NOT NULL,
email VARCHAR2(100) CONSTRAINT uq_appuser_email UNIQUE,
registration_date DATE DEFAULT SYSDATE
)
TABLESPACE user_data_ts;
解析:定义了各列的数据类型和约束,包括主键、唯一、非空和默认值,并指定了表空间。
ALTER TABLESPACE user_data_ts
ADD DATAFILE '/u02/oradata/DBNAME/user_data02.dbf' SIZE 20M;
解析:为现有表空间增加了物理存储容量。
ALTER TABLE app_users
ADD (last_login_ip VARCHAR2(15));
解析:向表中添加了一个新的属性列。
ALTER TABLE app_users
MODIFY (email VARCHAR2(120));
解析:修改了email列的最大长度,允许存储更长的邮箱地址。
ALTER TABLE app_users
ADD CONSTRAINT ck_appuser_username_len CHECK (LENGTH(username) >= 3);
解析:增加了对username字段长度的业务规则校验。
ALTER TABLE app_users
RENAME COLUMN registration_date TO join_date;
解析:更改了列的名称,使其更符合业务语义。
ALTER TABLE app_users
DROP CONSTRAINT uq_appuser_email;
解析:移除了对email列的唯一性要求。
DROP TABLE app_users;
解析:默认情况下 (如果回收站开启且未指定PURGE),DROP TABLE
会将表放入回收站。
DROP TABLESPACE user_data_ts INCLUDING CONTENTS AND DATAFILES;
解析:此命令会删除表空间、其中所有对象段以及操作系统层面的物理数据文件,操作不可逆,需谨慎。