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;
    

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

目录
相关文章
|
8月前
|
Web App开发 网络协议 Java
Windows 终端命令详解:PowerShell 初学者指南
Windows 终端是一个命令行工具,允许用户通过文本命令与系统交互,执行文件管理、系统配置和网络诊断等操作。PowerShell 是 Windows 终端的现代版本,相比传统的命令提示符(CMD),它功能更强大,支持脚本编写和复杂任务处理。本文将以 PowerShell 为主,带你从零开始学习。
1169 6
|
9月前
|
运维 开发者 Docker
一、Docker:一场颠覆应用部署与运维的容器革命
Docker的出现,就是为了解决“在我电脑上能跑”这个老大难问题。它像个魔法集装箱,把你的程序和它需要的所有东西(比如库、配置)都打包好,这样无论在哪运行,环境都一模一样。理解它很简单,就三个核心玩意儿:镜像是程序的“安装包”,容器是跑起来的程序,而仓库就是存放和分享这些“安装包”的地方。
695 6
|
8月前
|
关系型数据库 MySQL Shell
三、Docker常用命令
把 Docker 玩转,就像一个建筑师,需要掌握两套核心工具:一套用来管理你的“图纸”(镜像),另一套用来管理你用图纸盖好的“房子”(容器)。
764 3
|
8月前
|
存储 监控 Shell
四、Portainer图形化管理实战与Docker镜像原理
如果觉得命令行繁琐,可以试试Portainer这个图形化管理工具,让你在网页上点点鼠标就能轻松管理容器和镜像。安装它只需要一条docker run命令,非常方便。 同时,要理解Docker为何如此高效,关键在于它的镜像原理:镜像像洋-葱一样分层,启动容器时只在外面加一层可写的“外皮”。所有改动都发生在这层“外皮”上,这就是容器启动快、占用空间小的秘诀。
1051 5
|
8月前
|
存储 关系型数据库 MySQL
五、Docker 核心技术:容器数据持久化之数据卷
别把重要数据直接放进Docker容器里,因为容器就像一辆“临租车”,车一还(容器被删除),落在里面的东西就全没了。正确的做法是使用数据卷 (Volume),它好比一个属于你自己的、可插拔的“移动硬盘”。你可以把这个“硬盘”(具名数据卷)挂载到任何一辆“临租车”(容器)上使用。这样一来,就算车换了,你的数据也安然无恙,完美解决了数据库等应用的数据持久化问题。
1080 34
五、Docker 核心技术:容器数据持久化之数据卷
|
7月前
|
SQL Oracle 关系型数据库
Oracle 数据塑形:行列转换与集合运算
报表要求的数据格式总是千奇百怪?其实用SQL就能让数据轻松“变形”。想把多行内容(比如各科成绩)合并成一行里的多列,可以用经典的CASE WHEN,或者在11g以上版本里用更简洁的PIVOT。反过来,把宽表拆成多行,也有UNION ALL和更方便的UNPIVOT。学会这些,再配合UNION、INTERSECT等集合运算,数据就能随心所欲地展示了。
701 14
|
7月前
|
SQL 存储 移动开发
Oracle 视图
可以把Oracle视图看作是给一段复杂查询存的“快捷方式”,让你能像查一张简单的表一样去访问它,省去了每次都写长串代码的麻烦。普通视图只是个逻辑窗口,本身不存数据,主要用来简化操作和控制权限。但如果某个查询实在太慢,想用空间换时间,那就得用“物化视图”。它会真实地存一份数据副本,专门给查询提-速,是性能优化的一大杀手锏。
725 1
|
7月前
|
SQL Oracle 关系型数据库
Oracle 常用函数
拿到手的数据不总是规规矩矩的?Oracle内置了超多实用函数,可以直接在SQL里“加工”数据。无论是大小写转换、截取字符串,还是日期的加减、数字的四舍五入,都有对应的函数。特别推荐用NVL来优雅地处理空值,以及用CASE语句实现复杂的判断逻辑,能让你的查询既强大又省事。
898 4
|
7月前
|
SQL 移动开发 Oracle
Oracle 数据库查询:多表查询
想把分散在多个表里的数据拼起来看?核心就靠JOIN(连接)和子查询。可以用INNER JOIN找到两边都匹配的记录,或用OUTER JOIN查看单边也存在的数据。一个非常强大的技巧,是把一个查询结果当成临时表来用,能让复杂的统计分析变得清晰。再结合新版本里简洁的分页语法,跨表取数和展示就得心应手了。
1076 4