Oracle 数据库对象管理:表空间与表的操作

简介: 表空间和表的管理,是 Oracle 数据库日常维护里的基础操作。这篇文章从创建、修改到删除,一步步带你熟悉如何控制数据的“住址”和结构布局,还搭配了实用练习题,帮助你在实战中加深理解,学完就能自己动手建表了!

这次我们将深入学习如何管理数据库对象的核心——表空间 (Tablespace) 和 表 (Table)。理解如何创建、修改和删除这些对象,是进行有效数据存储和管理的基础。

image.png
image.png

一、表空间 (Tablespace):数据的逻辑容器 1.1 什么是表空间?
表空间是Oracle数据库中一个 重要的逻辑存储结构。它 将数据库的物理存储 (即数据文件) 与逻辑对象 (如表、索引) 分离开来。你可以 把它想象成一个 逻辑上的“文件夹”或“磁盘分区”,数据库对象 (如表) 创建时会被 指定存储在 某个表空间中。

1.2 表空间的作用:
组织数据:可以将相关的数据库对象组织在同一个表空间中,便于管理。 控制磁盘空间分配:可以为 不同的表空间分配 不同的物理数据文件,从而 控制其 大小和增长。
备份与恢复:表空间是备份和恢复的基本单位之一,可以对单个表空间进行联机或脱机操作。 性能优化:可以将 I/O密集型的对象 分布在不同的 物理磁盘上的 不同表空间中, 改善性能。

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 表空间添加数据文件
sql ALTER TABLESPACE app_data_ts ADD DATAFILE '/u01/app/oracle/oradata/ORCL/app_data02.dbf' SIZE 50M;
代码案例:修改 app_data01.dbf 数据文件大小
sql ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/ORCL/app_data01.dbf' RESIZE 200M;
代码案例:设置表空间脱机/联机
sql ALTER TABLESPACE app_data_ts OFFLINE; ALTER TABLESPACE app_data_ts ONLINE;

1.5 删除表空间 (DROP TABLESPACE)
语法格式:
sql DROP TABLESPACE tablespace_name [INCLUDING CONTENTS [AND DATAFILES]] [CASCADE CONSTRAINTS];
代码案例:删除 app_data_ts (假设为空)
sql DROP TABLESPACE app_data_ts;
代码案例:删除 app_data_ts 及其内容和物理文件
sql 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)
常见操作:
添加列
sql ALTER TABLE products ADD (stock_quantity NUMBER(5) DEFAULT 0);
修改列定义
sql ALTER TABLE products MODIFY (product_name VARCHAR2(150));
删除列
sql ALTER TABLE products DROP COLUMN supplier_id;
重命名列
sql ALTER TABLE products RENAME COLUMN entry_date TO creation_date;
添加/删除约束
sql -- 添加外键 (假设 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;
重命名表
sql RENAME products TO items_inventory;

2.3 删除表 (DROP TABLE)
语法格式:
sql DROP TABLE [schema_name.]table_name [CASCADE CONSTRAINTS] [PURGE];
代码案例:删除 items_inventory 表
sql DROP TABLE items_inventory CASCADE CONSTRAINTS;

2.4 清空表 (TRUNCATE TABLE)
语法格式:
sql TRUNCATE TABLE [schema_name.]table_name [DROP STORAGE | REUSE STORAGE];
代码案例:清空 items_inventory 表 (假设已重命名回来或重新创建了products)
sql TRUNCATE TABLE products;

本章小结:
本章我们 重点学习了Oracle中 表空间和 表的 管理操作。掌握 这些DDL语句是 构建和维护数据库 逻辑结构的 核心技能。

---

练习题 (共10道)
  1. 创建表空间:编写SQL语句创建一个名为 user_data_ts 的表空间,数据文件为 /u02/oradata/DBNAME/user_data01.dbf (替换DBNAME),初始大小50M,允许自动扩展,每次10M,最大200M。区管理本地自动分配,段空间自动管理。
  2. 创建用户表:在 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, 默认系统当前日期)。
  3. 添加数据文件到表空间:为 user_data_ts 表空间添加一个新的数据文件 /u02/oradata/DBNAME/user_data02.dbf,大小20M。
  4. 修改表 - 添加列:为 app_users 表添加一个新列 last_login_ip (VARCHAR2(15))。
  5. 修改表 - 修改列类型:将 app_users 表的 email 列长度修改为120个字符。
  6. 修改表 - 添加CHECK约束:为 app_users 表添加一个名为 ck_appuser_username_len 的检查约束,确保 username 的长度至少为3个字符。
  7. 修改表 - 重命名列:将 app_users 表的 registration_date 列重命名为 join_date。
  8. 删除约束:删除 app_users 表上的唯一约束 uq_appuser_email。
  9. 删除表并保留回收站:写出删除 app_users 表的SQL语句,确保它进入回收站 (如果回收站功能开启)。
  10. 彻底删除表空间:写出彻底删除 user_data_ts 表空间及其所有内容和物理数据文件的SQL语句 (假设里面可能还有其他对象)。
答案与解析:
  1. 创建表空间解析:

    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;
    

    解析:创建了指定大小、自动扩展参数、区及段管理方式的表空间。

  2. 创建用户表解析:

    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;
    

    解析:定义了各列的数据类型和约束,包括主键、唯一、非空和默认值,并指定了表空间。

  3. 添加数据文件到表空间解析:

    ALTER TABLESPACE user_data_ts
    ADD DATAFILE '/u02/oradata/DBNAME/user_data02.dbf' SIZE 20M;
    

    解析:为现有表空间增加了物理存储容量。

  4. 修改表 - 添加列解析:

    ALTER TABLE app_users
    ADD (last_login_ip VARCHAR2(15));
    

    解析:向表中添加了一个新的属性列。

  5. 修改表 - 修改列类型解析:

    ALTER TABLE app_users
    MODIFY (email VARCHAR2(120));
    

    解析:修改了email列的最大长度,允许存储更长的邮箱地址。

  6. 修改表 - 添加CHECK约束解析:

    ALTER TABLE app_users
    ADD CONSTRAINT ck_appuser_username_len CHECK (LENGTH(username) >= 3);
    

    解析:增加了对username字段长度的业务规则校验。

  7. 修改表 - 重命名列解析:

    ALTER TABLE app_users
    RENAME COLUMN registration_date TO join_date;
    

    解析:更改了列的名称,使其更符合业务语义。

  8. 删除约束解析:

    ALTER TABLE app_users
    DROP CONSTRAINT uq_appuser_email;
    

    解析:移除了对email列的唯一性要求。

  9. 删除表并保留回收站解析:

    DROP TABLE app_users;
    

    解析:默认情况下 (如果回收站开启且未指定PURGE),DROP TABLE 会将表放入回收站。

  10. 彻底删除表空间解析:

    DROP TABLESPACE user_data_ts INCLUDING CONTENTS AND DATAFILES;
    

    解析:此命令会删除表空间、其中所有对象段以及操作系统层面的物理数据文件,操作不可逆,需谨慎。

目录
相关文章
|
存储 Oracle 关系型数据库
Docker-14:Docker安装Oracle11g
Docker 安装 Oracle
4656 1
Docker-14:Docker安装Oracle11g
|
11月前
|
SQL 移动开发 Oracle
Oracle 数据库查询:多表查询
想把分散在多个表里的数据拼起来看?核心就靠JOIN(连接)和子查询。可以用INNER JOIN找到两边都匹配的记录,或用OUTER JOIN查看单边也存在的数据。一个非常强大的技巧,是把一个查询结果当成临时表来用,能让复杂的统计分析变得清晰。再结合新版本里简洁的分页语法,跨表取数和展示就得心应手了。
1322 4
|
存储 分布式计算 Linux
安装篇--CentOS 7 虚拟机安装
VMware 装 CentOS 7 不知道从哪下手?这篇超详细图文教程手把手教你在 VMware Workstation 中完成 CentOS 7 桌面系统的完整安装流程。从 ISO 镜像下载、虚拟机配置,到安装图形界面、设置用户密码,每一步都有截图讲解,适合零基础新手快速上手。装好之后无论你是要搭 Hadoop 集群,还是练 Linux ,这个环境都够你折腾一整天!
4928 3
|
11月前
|
SQL Oracle 关系型数据库
Oracle 数据塑形:行列转换与集合运算
报表要求的数据格式总是千奇百怪?其实用SQL就能让数据轻松“变形”。想把多行内容(比如各科成绩)合并成一行里的多列,可以用经典的CASE WHEN,或者在11g以上版本里用更简洁的PIVOT。反过来,把宽表拆成多行,也有UNION ALL和更方便的UNPIVOT。学会这些,再配合UNION、INTERSECT等集合运算,数据就能随心所欲地展示了。
957 14
|
11月前
|
SQL 存储 移动开发
Oracle 视图
可以把Oracle视图看作是给一段复杂查询存的“快捷方式”,让你能像查一张简单的表一样去访问它,省去了每次都写长串代码的麻烦。普通视图只是个逻辑窗口,本身不存数据,主要用来简化操作和控制权限。但如果某个查询实在太慢,想用空间换时间,那就得用“物化视图”。它会真实地存一份数据副本,专门给查询提-速,是性能优化的一大杀手锏。
1010 1
|
11月前
|
SQL Oracle 关系型数据库
Oracle 常用函数
拿到手的数据不总是规规矩矩的?Oracle内置了超多实用函数,可以直接在SQL里“加工”数据。无论是大小写转换、截取字符串,还是日期的加减、数字的四舍五入,都有对应的函数。特别推荐用NVL来优雅地处理空值,以及用CASE语句实现复杂的判断逻辑,能让你的查询既强大又省事。
1149 4
|
11月前
|
SQL 移动开发 Oracle
Oracle 窗口函数
想在看员工薪水的同时,还能在同一行看到他所在部门的平均薪水吗?或者想给每个部门的产品按销量排名?这就是窗口函数的魔力。它不像GROUP BY会把数据压缩成一行,而是为每一行都进行一次“开窗”计算。通过OVER(PARTITION BY ...),你可以轻松实现分组排名、累计求和、或是与前后行数据对比等高级分析,代码比复杂的自连接和子查询要优雅得多。
889 0
|
12月前
|
数据采集 前端开发 Java
职责分离的艺术:剖析主从Reactor模型如何实现极致的并发性能
Reactor单线程模型中,I/O操作由单一线程处理,但业务逻辑若同步执行会阻塞线程,影响性能。为此,引入工作者线程池模型,将非I/O任务剥离至独立线程池,提升响应速度。进一步发展为主从多线程模型:MainReactor处理连接建立,SubReactor多线程管理读写,并结合过滤器链实现数据预处理,异步编程提升并发效率。该架构职责分明、扩展性强,广泛应用于Netty等高性能框架,支持百万级并发。
513 11
|
SQL Oracle 关系型数据库
比较MySQL和Oracle数据库系统,特别是在进行分页查询的方法上的不同
两者的性能差异将取决于数据量大小、索引优化、查询设计以及具体版本的数据库服务器。考虑硬件资源、数据库设计和具体需求对于实现优化的分页查询至关重要。开发者和数据库管理员需要根据自身使用的具体数据库系统版本和环境,选择最合适的分页机制,并进行必要的性能调优来满足应用需求。
773 11