当前位置: 首页 > news >正文

Oracle 19c入门学习教程,从入门到精通,Oracle 数据表对象 —— 语法知识点详解与案例实践(10)

Oracle 数据表对象 —— 语法知识点详解与案例实践


一、环境准备:Oracle 安装与配置(简要指南)

说明:本章内容基于 Oracle Database。以下为在 Windows 或 Linux 上安装 Oracle Database 的基本步骤(以 Oracle 21c Express Edition 为例)。

1. 下载 Oracle Database

  • 访问官网:https://www.oracle.com/database/technologies/xe-downloads.html
  • 下载 Oracle Database 21c XE(免费版)

2. 安装步骤(Windows 示例)

  1. 以管理员身份运行安装程序OracleXE213_Win64.exe
  2. 设置数据库口令(如:oracle123
  3. 选择安装路径(默认即可)
  4. 安装完成后,服务会自动启动:
    • OracleServiceXE
    • OracleXETNSListener

3. 连接数据库

使用 SQL*Plus 或 SQL Developer 连接:

# 使用 sqlplus 命令行sqlplus sys/oracle123@localhost:1521/XE as sysdba

或创建普通用户(推荐):

-- 创建表空间(可选)CREATETABLESPACEusers_ts DATAFILE'users_ts.dbf'SIZE100M AUTOEXTENDON;-- 创建用户CREATEUSERhr IDENTIFIEDBYhr123DEFAULTTABLESPACEusers_ts;-- 授予权限GRANTCONNECT,RESOURCE,CREATEVIEWTOhr;

然后用hr/hr123登录进行练习。


二、数据表操作语法详解与案例


1. 数据表概述

  • 表是 Oracle 中存储数据的基本逻辑单元。
  • 每个表由行(记录)和列(字段)组成。
  • 表属于某个用户(Schema),如hr.employees

2. 创建数据表(CREATE TABLE)

语法:
CREATETABLE[schema.]table_name(column_name datatype[DEFAULTexpr][column_constraint],...[table_constraint])[TABLESPACEtablespace_name];
案例:创建员工表
-- 创建 employees 表CREATETABLEemployees(emp_id NUMBER(6)PRIMARYKEY,-- 主键约束first_name VARCHAR2(20),-- 可为空last_name VARCHAR2(25)NOTNULL,-- 非空约束email VARCHAR2(30)UNIQUE,-- 唯一性约束phone VARCHAR2(20),hire_dateDATEDEFAULTSYSDATE,-- 默认当前日期job_id VARCHAR2(10),salary NUMBER(8,2)CHECK(salary>0),-- 检查约束(隐式)manager_id NUMBER(6),dept_id NUMBER(4));

注释

  • VARCHAR2是 Oracle 推荐的变长字符串类型。
  • DEFAULT SYSDATE表示若未提供值,则自动填入系统当前日期。
  • CHECK约束确保工资大于 0。

3. 数据表的逻辑结构

  • 段(Segment):表在物理上对应一个数据段。
  • 区(Extent):由多个连续数据块组成。
  • 块(Block):最小 I/O 单元,默认 8KB。

可通过USER_SEGMENTS查看:

SELECTsegment_name,segment_type,bytes/1024/1024ASsize_mbFROMuser_segmentsWHEREsegment_name='EMPLOYEES';

4. 数据表的特性

  • 支持分区(Partitioning)
  • 支持压缩(Compression)
  • 支持并行处理
  • 可设置存储参数(如 PCTFREE, INITTRANS)

5. 维护数据表

(1) 增加字段(ADD COLUMN)
-- 添加奖金字段ALTERTABLEemployeesADD(bonus NUMBER(8,2));
(2) 删除字段(DROP COLUMN)
-- 删除 phone 字段ALTERTABLEemployeesDROPCOLUMNphone;

⚠️ 注意:删除字段不可逆,且可能影响性能(标记删除,后续清理)。

(3) 修改字段(MODIFY COLUMN)
-- 修改 salary 精度,并设默认值ALTERTABLEemployeesMODIFY(salary NUMBER(10,2)DEFAULT5000.00);-- 修改字段为非空ALTERTABLEemployeesMODIFY(first_name VARCHAR2(20)NOTNULL);
(4) 重命名表(RENAME)
-- 重命名表RENAMEemployeesTOemp_info;-- 或ALTERTABLEemp_infoRENAMETOemployees;
(5) 改变表空间和存储参数
-- 移动表到新表空间ALTERTABLEemployees MOVETABLESPACEusers_ts;-- 修改存储参数(需启用 row movement)ALTERTABLEemployees MOVE PCTFREE20INITTRANS4;
(6) 删除表(DROP TABLE)
-- 普通删除(可闪回)DROPTABLEemployees;-- 彻底删除(不可恢复)DROPTABLEemployeesPURGE;-- 闪回恢复(如果未 purge)FLASHBACKTABLEemployeesTOBEFOREDROP;
(7) 修改表状态
-- 设置为只读ALTERTABLEemployeesREADONLY;-- 恢复为读写ALTERTABLEemployeesREADWRITE;

6. 数据完整性与约束

约束用于保证数据的准确性与一致性。

(1) 非空约束(NOT NULL)
-- 创建时定义CREATETABLEtest_notnull(id NUMBER,name VARCHAR2(20)NOTNULL);-- 或通过修改添加(需先确保无空值)ALTERTABLEemployeesMODIFY(last_name VARCHAR2(25)NOTNULL);
(2) 主键约束(PRIMARY KEY)
-- 创建表时定义CREATETABLEdepartments(dept_id NUMBER(4)PRIMARYKEY,dept_name VARCHAR2(30)NOTNULL);-- 或单独添加ALTERTABLEemployeesADDCONSTRAINTemp_pkPRIMARYKEY(emp_id);
(3) 唯一性约束(UNIQUE)
ALTERTABLEemployeesADDCONSTRAINTemp_email_ukUNIQUE(email);
(4) 外键约束(FOREIGN KEY)
-- 先确保主表存在CREATETABLEdepartments(dept_id NUMBER(4)PRIMARYKEY,dept_name VARCHAR2(30));-- 在 employees 中添加外键ALTERTABLEemployeesADDCONSTRAINTemp_dept_fkFOREIGNKEY(dept_id)REFERENCESdepartments(dept_id)ONDELETESETNULL;-- 或 CASCADE / NO ACTION(默认)

外键选项说明

  • ON DELETE CASCADE:主表删除,从表级联删除。
  • ON DELETE SET NULL:主表删除,从表字段设为 NULL(要求字段可为空)。
(5) 禁用和激活约束
-- 禁用外键约束(常用于大批量导入)ALTERTABLEemployeesDISABLECONSTRAINTemp_dept_fk;-- 激活约束(会验证现有数据)ALTERTABLEemployeesENABLECONSTRAINTemp_dept_fk;-- 启用但不验证已有数据(需谨慎)ALTERTABLEemployeesENABLENOVALIDATECONSTRAINTemp_dept_fk;
(6) 删除约束
-- 删除约束(保留列)ALTERTABLEemployeesDROPCONSTRAINTemp_email_uk;-- 删除主键(同时删除唯一索引)ALTERTABLEemployeesDROPPRIMARYKEY;

三、综合性案例

案例目标:

  1. 创建部门表和员工表,建立主外键关系。
  2. 插入测试数据。
  3. 修改表结构:增加字段、修改约束。
  4. 演示约束禁用与启用。
  5. 删除表并恢复(闪回)。

步骤 1:创建表结构

-- 创建部门表CREATETABLEdepartments(dept_id NUMBER(4)PRIMARYKEY,dept_name VARCHAR2(30)NOTNULL,location VARCHAR2(50));-- 创建员工表(暂不加外键)CREATETABLEemployees(emp_id NUMBER(6),first_name VARCHAR2(20),last_name VARCHAR2(25)NOTNULL,email VARCHAR2(30),hire_dateDATEDEFAULTSYSDATE,salary NUMBER(8,2)CHECK(salary>0),dept_id NUMBER(4));-- 添加主键ALTERTABLEemployeesADDCONSTRAINTemp_pkPRIMARYKEY(emp_id);-- 添加唯一约束ALTERTABLEemployeesADDCONSTRAINTemp_email_ukUNIQUE(email);-- 添加外键(引用 departments)ALTERTABLEemployeesADDCONSTRAINTemp_dept_fkFOREIGNKEY(dept_id)REFERENCESdepartments(dept_id)ONDELETESETNULL;

步骤 2:插入测试数据

-- 插入部门INSERTINTOdepartmentsVALUES(10,'HR','Beijing');INSERTINTOdepartmentsVALUES(20,'IT','Shanghai');-- 插入员工INSERTINTOemployees(emp_id,first_name,last_name,email,salary,dept_id)VALUES(101,'Alice','Smith','alice@example.com',8000,10);INSERTINTOemployees(emp_id,first_name,last_name,email,salary,dept_id)VALUES(102,'Bob','Lee','bob@example.com',9000,20);

步骤 3:修改表结构

-- 增加字段ALTERTABLEemployeesADD(commission_pct NUMBER(2,2));-- 修改字段默认值ALTERTABLEemployeesMODIFY(commission_pctDEFAULT0.1);-- 尝试插入违反外键的数据(会失败)-- INSERT INTO employees VALUES (103, 'Tom', 'King', 'tom@example.com', SYSDATE, 7000, 99); -- 错误!dept_id=99 不存在

步骤 4:禁用约束并批量导入

-- 禁用外键(假设要导入历史数据)ALTERTABLEemployeesDISABLECONSTRAINTemp_dept_fk;-- 插入无效 dept_id(临时允许)INSERTINTOemployees(emp_id,first_name,last_name,email,salary,dept_id)VALUES(103,'Charlie','Brown','charlie@example.com',6000,99);-- 修复数据或删除无效行DELETEFROMemployeesWHEREdept_id=99;-- 重新启用约束ALTERTABLEemployeesENABLECONSTRAINTemp_dept_fk;

步骤 5:删除与闪回

-- 删除表(放入回收站)DROPTABLEemployees;-- 查看回收站SHOWRECYCLEBIN;-- 闪回恢复FLASHBACKTABLEemployeesTOBEFOREDROP;-- 重命名恢复后的表(如果名字冲突)FLASHBACKTABLE"BIN$...$"TOBEFOREDROPRENAMETOemployees_old;

四、总结

操作类型关键语法
创建表CREATE TABLE ...
增加字段ALTER TABLE ... ADD (...)
修改字段ALTER TABLE ... MODIFY (...)
删除字段ALTER TABLE ... DROP COLUMN ...
重命名表RENAME old TO new
添加主键ADD CONSTRAINT pk PRIMARY KEY (...)
添加外键ADD CONSTRAINT fk FOREIGN KEY (...) REFERENCES ...
禁用约束ALTER TABLE ... DISABLE CONSTRAINT ...
删除表DROP TABLE ... [PURGE]
闪回表FLASHBACK TABLE ... TO BEFORE DROP

最佳实践建议

  • 所有约束命名(如emp_pk),便于管理。
  • 生产环境避免频繁DROP COLUMN
  • 大批量数据操作前,考虑禁用约束并事后验证。
  • 使用PURGE谨慎,避免无法恢复。

如有进一步需求(如分区表、物化视图、索引组织表等高级特性),可继续扩展本章内容。

http://www.jsqmd.com/news/285592/

相关文章:

  • Cadence推出人工智能语音助手Tensilica HiFi iQ DSP IP
  • 鸿蒙 HarmonyOS 6 | 系统能力 (04):构建专业级媒体应用 PhotoAccessHelper 与复杂媒体库管理
  • 基于python的智慧农场管理系统
  • 【鸿蒙原生开发会议随记 Pro】拒绝面条代码 基于 MVVM 的代码架构与状态管理选型
  • aiSim领衔!国内外自动驾驶仿真软件大全:热门推荐与选择指南
  • 芒格的“反向激励“分析在量子计算云服务定价中的应用
  • 基于springboot的植物花卉销售管理系统
  • 20252803-Linux安全类实验-ShellShock 攻击实验 - 详解
  • 铟材料:稀散金属隐形明星,半导体+光伏核心刚需
  • 自动驾驶仿真软件推荐:康谋aiSim——ISO 26262 ASIL-D 认证的高保真选择
  • 关于Uvicorn:一个遵循ASGI规范的异步Web服务器
  • 9个最佳性能测试工具(2026)
  • 058.质数判断 +质数筛 + 质因子分解
  • 超融合 “进化论”:当 HCI 遇上云原生技术栈,下一代基础设施雏形初现
  • 从零构建云原生“试验田”:超融合的自我修养
  • 智慧园区智能照明控制系统解决方案
  • 3-VueAjax
  • 基于springBoot的动漫分享系统的设计与实现
  • 天然蛋白与重组蛋白的技术区别与实验应用全解析:科研试剂视角下的最佳指南
  • 2026年还在靠“开机等单”跑网约车?学会这几条,超越同城80%的司机!
  • 导师严选2026 AI论文平台TOP8:MBA开题报告全测评
  • 基于springBoot的高校学生绩点管理系统的设计与实现
  • 5年测试被裁,去面试差点被问哭了······
  • 基于springBoot的房屋租赁管理系统
  • 基于springBoot的高校毕业生公职资讯系统的设计与实现
  • 金三银四,我不允许你们不知道这些软件测试面试题
  • 基于SpringBoot的高校餐饮档口管理系统的设计与实现
  • 看似平平无奇的00后,居然一跃上岸字节,表示真的卷不过......
  • 设计模式——模板方法模式
  • 设计模式——桥接模式