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 示例)
- 以管理员身份运行安装程序
OracleXE213_Win64.exe - 设置 数据库口令 (如:
oracle123) - 选择安装路径(默认即可)
- 安装完成后,服务会自动启动:
OracleServiceXEOracleXETNSListener
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:创建表结构
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谨慎,避免无法恢复。
如有进一步需求(如分区表、物化视图、索引组织表等高级特性),可继续扩展本章内容。