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

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


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

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

1. 下载 Oracle Database

2. 安装步骤(Windows 示例)

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

3. 连接数据库

使用 SQL*Plus 或 SQL Developer 连接:

bash 复制代码
# 使用 sqlplus 命令行
sqlplus sys/oracle123@localhost:1521/XE as sysdba

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

sql 复制代码
-- 创建表空间(可选)
CREATE TABLESPACE users_ts DATAFILE 'users_ts.dbf' SIZE 100M AUTOEXTEND ON;

-- 创建用户
CREATE USER hr IDENTIFIED BY hr123 DEFAULT TABLESPACE users_ts;

-- 授予权限
GRANT CONNECT, RESOURCE, CREATE VIEW TO hr;

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


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


1. 数据表概述

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

2. 创建数据表(CREATE TABLE)

语法:
sql 复制代码
CREATE TABLE [schema.]table_name (
    column_name datatype [DEFAULT expr] [column_constraint],
    ...
    [table_constraint]
) [TABLESPACE tablespace_name];
案例:创建员工表
sql 复制代码
-- 创建 employees 表
CREATE TABLE employees (
    emp_id      NUMBER(6) PRIMARY KEY,          -- 主键约束
    first_name  VARCHAR2(20),                   -- 可为空
    last_name   VARCHAR2(25) NOT NULL,          -- 非空约束
    email       VARCHAR2(30) UNIQUE,            -- 唯一性约束
    phone       VARCHAR2(20),
    hire_date   DATE DEFAULT SYSDATE,           -- 默认当前日期
    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 查看:

sql 复制代码
SELECT segment_name, segment_type, bytes/1024/1024 AS size_mb
FROM user_segments
WHERE segment_name = 'EMPLOYEES';

4. 数据表的特性

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

5. 维护数据表

(1) 增加字段(ADD COLUMN)
sql 复制代码
-- 添加奖金字段
ALTER TABLE employees ADD (bonus NUMBER(8,2));
(2) 删除字段(DROP COLUMN)
sql 复制代码
-- 删除 phone 字段
ALTER TABLE employees DROP COLUMN phone;

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

(3) 修改字段(MODIFY COLUMN)
sql 复制代码
-- 修改 salary 精度,并设默认值
ALTER TABLE employees MODIFY (
    salary NUMBER(10,2) DEFAULT 5000.00
);

-- 修改字段为非空
ALTER TABLE employees MODIFY (first_name VARCHAR2(20) NOT NULL);
(4) 重命名表(RENAME)
sql 复制代码
-- 重命名表
RENAME employees TO emp_info;
-- 或
ALTER TABLE emp_info RENAME TO employees;
(5) 改变表空间和存储参数
sql 复制代码
-- 移动表到新表空间
ALTER TABLE employees MOVE TABLESPACE users_ts;

-- 修改存储参数(需启用 row movement)
ALTER TABLE employees MOVE PCTFREE 20 INITTRANS 4;
(6) 删除表(DROP TABLE)
sql 复制代码
-- 普通删除(可闪回)
DROP TABLE employees;

-- 彻底删除(不可恢复)
DROP TABLE employees PURGE;

-- 闪回恢复(如果未 purge)
FLASHBACK TABLE employees TO BEFORE DROP;
(7) 修改表状态
sql 复制代码
-- 设置为只读
ALTER TABLE employees READ ONLY;

-- 恢复为读写
ALTER TABLE employees READ WRITE;

6. 数据完整性与约束

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

(1) 非空约束(NOT NULL)
sql 复制代码
-- 创建时定义
CREATE TABLE test_notnull (
    id NUMBER,
    name VARCHAR2(20) NOT NULL
);

-- 或通过修改添加(需先确保无空值)
ALTER TABLE employees MODIFY (last_name VARCHAR2(25) NOT NULL);
(2) 主键约束(PRIMARY KEY)
sql 复制代码
-- 创建表时定义
CREATE TABLE departments (
    dept_id   NUMBER(4) PRIMARY KEY,
    dept_name VARCHAR2(30) NOT NULL
);

-- 或单独添加
ALTER TABLE employees ADD CONSTRAINT emp_pk PRIMARY KEY (emp_id);
(3) 唯一性约束(UNIQUE)
sql 复制代码
ALTER TABLE employees ADD CONSTRAINT emp_email_uk UNIQUE (email);
(4) 外键约束(FOREIGN KEY)
sql 复制代码
-- 先确保主表存在
CREATE TABLE departments (
    dept_id   NUMBER(4) PRIMARY KEY,
    dept_name VARCHAR2(30)
);

-- 在 employees 中添加外键
ALTER TABLE employees 
ADD CONSTRAINT emp_dept_fk 
FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
ON DELETE SET NULL;  -- 或 CASCADE / NO ACTION(默认)

外键选项说明

  • ON DELETE CASCADE:主表删除,从表级联删除。
  • ON DELETE SET NULL:主表删除,从表字段设为 NULL(要求字段可为空)。
(5) 禁用和激活约束
sql 复制代码
-- 禁用外键约束(常用于大批量导入)
ALTER TABLE employees DISABLE CONSTRAINT emp_dept_fk;

-- 激活约束(会验证现有数据)
ALTER TABLE employees ENABLE CONSTRAINT emp_dept_fk;

-- 启用但不验证已有数据(需谨慎)
ALTER TABLE employees ENABLE NOVALIDATE CONSTRAINT emp_dept_fk;
(6) 删除约束
sql 复制代码
-- 删除约束(保留列)
ALTER TABLE employees DROP CONSTRAINT emp_email_uk;

-- 删除主键(同时删除唯一索引)
ALTER TABLE employees DROP PRIMARY KEY;

三、综合性案例

案例目标:

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

步骤 1:创建表结构

sql 复制代码
-- 创建部门表
CREATE TABLE departments (
    dept_id    NUMBER(4) PRIMARY KEY,
    dept_name  VARCHAR2(30) NOT NULL,
    location   VARCHAR2(50)
);

-- 创建员工表(暂不加外键)
CREATE TABLE employees (
    emp_id     NUMBER(6),
    first_name VARCHAR2(20),
    last_name  VARCHAR2(25) NOT NULL,
    email      VARCHAR2(30),
    hire_date  DATE DEFAULT SYSDATE,
    salary     NUMBER(8,2) CHECK (salary > 0),
    dept_id    NUMBER(4)
);

-- 添加主键
ALTER TABLE employees ADD CONSTRAINT emp_pk PRIMARY KEY (emp_id);

-- 添加唯一约束
ALTER TABLE employees ADD CONSTRAINT emp_email_uk UNIQUE (email);

-- 添加外键(引用 departments)
ALTER TABLE employees 
ADD CONSTRAINT emp_dept_fk 
FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
ON DELETE SET NULL;

步骤 2:插入测试数据

sql 复制代码
-- 插入部门
INSERT INTO departments VALUES (10, 'HR', 'Beijing');
INSERT INTO departments VALUES (20, 'IT', 'Shanghai');

-- 插入员工
INSERT INTO employees (emp_id, first_name, last_name, email, salary, dept_id)
VALUES (101, 'Alice', 'Smith', 'alice@example.com', 8000, 10);

INSERT INTO employees (emp_id, first_name, last_name, email, salary, dept_id)
VALUES (102, 'Bob', 'Lee', 'bob@example.com', 9000, 20);

步骤 3:修改表结构

sql 复制代码
-- 增加字段
ALTER TABLE employees ADD (commission_pct NUMBER(2,2));

-- 修改字段默认值
ALTER TABLE employees MODIFY (commission_pct DEFAULT 0.1);

-- 尝试插入违反外键的数据(会失败)
-- INSERT INTO employees VALUES (103, 'Tom', 'King', 'tom@example.com', SYSDATE, 7000, 99); -- 错误!dept_id=99 不存在

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

sql 复制代码
-- 禁用外键(假设要导入历史数据)
ALTER TABLE employees DISABLE CONSTRAINT emp_dept_fk;

-- 插入无效 dept_id(临时允许)
INSERT INTO employees (emp_id, first_name, last_name, email, salary, dept_id)
VALUES (103, 'Charlie', 'Brown', 'charlie@example.com', 6000, 99);

-- 修复数据或删除无效行
DELETE FROM employees WHERE dept_id = 99;

-- 重新启用约束
ALTER TABLE employees ENABLE CONSTRAINT emp_dept_fk;

步骤 5:删除与闪回

sql 复制代码
-- 删除表(放入回收站)
DROP TABLE employees;

-- 查看回收站
SHOW RECYCLEBIN;

-- 闪回恢复
FLASHBACK TABLE employees TO BEFORE DROP;

-- 重命名恢复后的表(如果名字冲突)
FLASHBACK TABLE "BIN$...$" TO BEFORE DROP RENAME TO employees_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 谨慎,避免无法恢复。

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

相关推荐
_Kayo_1 小时前
Node.JS 学习笔记8
笔记·学习·node.js
咸鱼翻身小阿橙1 小时前
SQL上半部分
服务器·数据库·sql
Elastic 中国社区官方博客1 小时前
Elasticsearch:监控 LLM 推理和 Agent Builder 使用 OpenRouter
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
Gobysec1 小时前
Goby 漏洞安全通告|GNU InetUtils Telnetd USER环境变量注入 权限绕过漏洞(CVE-2026-24061)
数据库·安全·gnu·漏洞分析·漏洞预警
wregjru1 小时前
【QT】2.QT 信号和槽
数据库
麦兜*1 小时前
SpringBoot Profile多环境配置详解,一套配置应对所有场景
java·数据库·spring boot
javajingling1 小时前
redis命令
数据库·redis·缓存
炽烈小老头2 小时前
【每天学习一点算法 2026/01/22】杨辉三角
学习·算法
枷锁—sha2 小时前
【CTF笔记篇】SQL 注入总结
数据库·笔记·sql·安全·网络安全