目录
对于 Oracle 数据库初学者来说,表是数据存储的核心载体,掌握表的创建、维护和约束管理是入门的关键。本文基于 Oracle 表维护的核心知识,从数据类型、表结构创建、约束管理到表结构修改,全方位梳理重点内容,帮你快速上手 Oracle 表操作。
一、Oracle 数据类型:选对类型是基础
数据类型决定了字段能存储的数据种类和范围,选对类型不仅能节省空间,还能避免数据错误。Oracle 的常用数据类型可分为几大类,其中部分类型已过时,初学者需重点掌握当前主流类型。
1️⃣字符型:存储文本数据
- CHAR:固定长度字符串,最大长度 2000 字节。无论实际存储内容长短,都会占用指定长度的空间(例如
CHAR(10)
即使存 "abc",也占 10 字节)。 - VARCHAR2:可变长度字符串,最大长度 4000 字节,可做索引的最大长度为 749 字节。仅占用实际内容 + 1 字节(用于记录长度),比 CHAR 更节省空间,是日常存储文本的首选。
- NCHAR/NVARCHAR2:与 CHAR/VARCHAR2 类似,但长度根据字符集(如 UTF-8)而定,适合存储多语言文本。
- CLOB/NCLOB:用于存储超长字符数据(最大 4G),替代已过时的
LONG
类型(如存储文章、日志)。
2️⃣数字型:存储数值数据
- NUMBER(P,S):最常用的数字类型,
P
表示总位数(整数 + 小数),S
表示小数位数。例如NUMBER(5,2)
可存 - 999.99 到 999.99 之间的数。 - INTEGER:整数类型,等价于
NUMBER(38,0)
,适合存储无需小数的数值(如年龄、数量)。 - FLOAT/REAL:浮点数类型,
FLOAT
等价于NUMBER(38)
(双精度),REAL
等价于NUMBER(63)
(更高精度),适合科学计算。
3️⃣日期型:存储时间数据
- DATE:存储日期和时间,格式为
DD-MM-YY(HH-MI-SS)
,精确到秒,且经过严格测试无 “千年虫” 问题。例如可存储 “23-10-23 14:30:00”(2023 年 10 月 23 日 14 点 30 分)。
4️⃣二进制 / 大对象型:存储特殊数据
- BLOB:存储二进制数据(如图片、音频),最大 4G,替代已过时的
RAW
和LONG RAW
。 - BFILE:存储数据库外部的二进制文件(如本地图片),最大 4G,文件实际存放在操作系统中,数据库仅记录路径。
5️⃣行标识型:定位记录
- ROWID:表中每条记录的唯一行号(10 字节),可快速定位记录(类似 “地址”),但不建议手动修改。
- NROWID:二进制表的唯一行号,最大 4000 字节,用于特殊表结构。
注意:
LONG
、RAW
、LONG RAW
等类型已过时,Oracle 推荐用CLOB
、BLOB
替代,避免后续版本不兼容。
二、创建表结构:搭建数据存储框架
创建表是存储数据的第一步,需明确表名、字段名和字段类型。以下是基础操作和相关技巧。
1️⃣基本语法:创建表
用CREATE TABLE
语句创建表,语法如下:
sql
CREATE TABLE 表名 (
字段名1 数据类型(长度),
字段名2 数据类型(长度),
...
);
示例:创建员工表EMP
,包含员工编号(EMPNO
)和姓名(ENAME
):
sql
CREATE TABLE EMP (
EMPNO NUMBER(4), -- 员工编号,4位数字
ENAME VARCHAR2(10) -- 员工姓名,最长10个字符
);
2️⃣查看表结构:验证创建结果
创建后可用DESC
命令查看表结构(字段名、类型等):
sql
DESC EMP; -- 查看EMP表的字段信息
3️⃣删除表:谨慎操作
若表不再需要,用DROP TABLE
删除(删除后数据无法恢复,需谨慎):
sql
DROP TABLE my_emp; -- 删除名为my_emp的表
4️⃣添加注释:让表更易理解
为表和字段添加注释,方便后续维护(尤其多人协作时):
- 给表加注释:
sql
COMMENT ON TABLE 表名 IS '表的说明'; -- 示例:给student表加注释 COMMENT ON TABLE student IS '学生信息表';
- 给字段加注释:
sql
COMMENT ON COLUMN 表名.字段名 IS '字段的说明'; -- 示例:给student表的hiredate字段加注释 COMMENT ON COLUMN student.hiredate IS '入学时间';
查看注释:
- 查看表注释:
sql
SELECT table_name, comments FROM user_tab_comments WHERE table_name = '表名';
- 查看字段注释:
sql
SELECT table_name, column_name, comments FROM user_col_comments WHERE table_name = '表名';
三、约束管理:给数据定 “规矩”
约束是保证数据合法性的规则,Oracle 有 5 种常用约束,初学者需掌握其作用和创建方法。
什么是约束?
简单说,约束就是 “数据必须遵守的规矩”。例如 “学生表的学号不能重复”“年龄不能为负数”,这些规则都可通过约束实现。
1️⃣主键约束(PRIMARY KEY):唯一标识记录
主键是表中唯一标识每条记录的字段(或字段组合),特点:
- 字段值唯一且不能为 NULL;
- Oracle 会自动为其创建唯一索引,加速查询;
- 一个表只能有一个主键。
创建方式:
- 单字段主键(建表时定义):
sql
-- 系统自动命名主键 CREATE TABLE bkeep1(empno NUMBER(5) PRIMARY KEY); -- 自定义主键名(推荐,方便管理) CREATE TABLE bkeep2(empno NUMBER(5) CONSTRAINT bkeep_pk PRIMARY KEY);
- 联合主键(多字段组合唯一):
sql
-- empno和ename组合起来唯一标识记录 CREATE TABLE bkeep3( empno NUMBER(5), ename VARCHAR2(10), CONSTRAINT bkeep_pk3 PRIMARY KEY(empno, ename) );
- 建表后添加主键:
sql
CREATE TABLE bkeep4(empno NUMBER(5)); -- 先建表 ALTER TABLE bkeep4 ADD PRIMARY KEY(empno); -- 再添加主键
2️⃣外键约束(FOREIGN KEY):关联两张表
外键用于关联两个表,让 “从表” 的字段值必须来自 “主表” 的主键(或唯一键),例如 “订单表的用户 ID 必须存在于用户表中”。
<1>术语:
- 主表:被参考的表(如用户表);
- 从表:依赖主表的表(如订单表)。
<2.规则:
- 从表外键字段与主表参考字段的数据类型必须一致;
- 外键值可以为 NULL(表示 “暂未关联”);
- 一个表可有多个外键(关联多个主表)。
<3>创建方式:
- 建表时直接关联:
sql
-- bkeep5的sid字段参考student表的sid(主键) CREATE TABLE bkeep5( empno NUMBER(5), sid NUMBER(6) REFERENCES student(sid) );
- 建表时单独定义外键:
sql
CREATE TABLE bkeep7( empno NUMBER(5), sid NUMBER(6), FOREIGN KEY(sid) REFERENCES student(sid) -- 明确指定外键 );
- 建表后添加外键:
sql
CREATE TABLE bkeep6(empno NUMBER(5), sid NUMBER(6)); -- 先建表 ALTER TABLE bkeep6 ADD FOREIGN KEY(sid) REFERENCES student(sid); -- 再添加外键
主表对从表的控制:
当主表记录被修改或删除时,可通过以下规则控制从表:
ON DELETE CASCADE
:主表记录删除,从表关联记录也删除(级联删除);ON DELETE SET NULL
:主表记录删除,从表外键值设为 NULL;NO ACTION
:若从表有关联记录,不允许删除主表记录(Oracle 默认)。
示例:级联删除
sql
-- 当student表的sid被删除时,bkeep5中关联的记录也会被删除
CREATE TABLE bkeep5(
empno NUMBER(5),
sid NUMBER(6) REFERENCES student(sid) ON DELETE CASCADE
);
3️⃣非空约束(NOT NULL):字段值不能为 NULL
非空约束强制字段必须有值,例如 “学生表的姓名不能空”。
创建方式:
- 建表时定义:
sql
CREATE TABLE bkeep8(empno NUMBER(5) NOT NULL); -- empno必须有值
- 建表后添加(需确保已有数据中该字段无 NULL):
sql
ALTER TABLE bkeep10 MODIFY(sid NUMBER(5) NOT NULL);
4️⃣唯一约束(UNIQUE):字段值唯一但可空
唯一约束确保字段值不重复,但允许有多个 NULL(与主键的区别:主键不允许 NULL)。例如 “学生表的邮箱可空,但不为空时必须唯一”。
创建方式:
- 建表时定义:
sql
CREATE TABLE bkeep12( empno NUMBER(5) UNIQUE, -- empno唯一,可空 sid NUMBER(6) );
- 建表后添加:
sql
ALTER TABLE bkeep12 MODIFY(empno NUMBER(5) UNIQUE);
5️⃣检查约束(CHECK):限定值的范围
检查约束用于限制字段值的范围,例如 “年龄必须在 0-130 之间”“性别只能是‘男’或‘女’”。
创建方式:
- 建表时定义:
sql
-- 年龄必须在20-99之间 CREATE TABLE bkeep9(age NUMBER(4) CHECK(age > 20 AND age < 99));
- 建表后添加:
sql
CREATE TABLE bkeep9(age NUMBER(3)); -- 先建表 ALTER TABLE bkeep9 ADD CHECK(age >= 0 AND age <= 130); -- 再限制年龄范围
四、修改表结构:灵活调整表定义
实际业务中,表结构可能需要调整(如添加字段、修改类型),Oracle 提供了丰富的修改命令,但需注意:尽量减少生产环境的表结构修改,避免影响业务。
1️⃣删除约束
- 删除主键(若被从表引用,需加
CASCADE
删除关联外键):sql
ALTER TABLE bkeep1 DROP PRIMARY KEY; -- 无关联时 ALTER TABLE bkeep1 DROP PRIMARY KEY CASCADE; -- 有从表关联时
- 按约束名删除(外键常用,需先知道约束名):
sql
ALTER TABLE bkeep1 DROP CONSTRAINT SYS_C0011074; -- SYS_C0011074是约束名
2️⃣添加新字段
用ADD
命令添加字段:
sql
-- 给bkeep1表添加sname字段(可变长度字符串,最长2字节)
ALTER TABLE bkeep1 ADD(sname VARCHAR2(2));
3️⃣修改字段
- 修改长度:
sql
-- 将sname的长度从2改为60 ALTER TABLE bkeep1 MODIFY(sname VARCHAR2(60));
- 修改类型(需确保字段无数据或数据兼容):
sql
-- 将sname从VARCHAR2改为CHAR ALTER TABLE bkeep1 MODIFY(sname CHAR(60));
- 修改字段名:
sql
-- 将sname改名为studentname ALTER TABLE bkeep1 RENAME COLUMN sname TO studentname;
4️⃣删除字段
用DROP COLUMN
删除字段(删除后数据丢失,谨慎操作):
sql
ALTER TABLE bkeep1 DROP COLUMN bkeep11; -- 删除bkeep11字段
5️⃣修改表名
用RENAME
命令修改表名:
sql
RENAME bkeep1 TO bkeepone; -- 将bkeep1改名为bkeepone
总结:表维护的核心要点
Oracle 表维护是数据库操作的基础,初学者需重点掌握:
- 数据类型:优先使用
VARCHAR2
、NUMBER
、DATE
、CLOB
、BLOB
等主流类型; - 表创建:熟练使用
CREATE TABLE
,记得添加注释提高可读性; - 约束管理:主键(唯一标识)、外键(关联表)、非空(必传值)是核心,根据业务需求合理设置;
- 表修改:谨慎操作,修改前备份数据,避免影响现有业务。