上一篇
数据库怎么创建表 db2
- 数据库
- 2025-08-11
- 7
在 DB2 中创建表使用
CREATE TABLE 语句,需指定表名、字段及数据类型(如 INT、VARCHAR),可定义主键、非空等约束,示例:`CREATE TABLE tab(id INT PRIMARY KEY, name VARCHAR
核心要素详解
| 组成要素 | 作用说明 | 典型取值范围 |
|---|---|---|
COLUMN_NAME |
定义字段名称 | 字母开头,可包含数字/下划线 |
DATATYPE |
指定字段的数据类型 | INTEGER, VARCHAR, DECIMAL, DATE等 |
NULL/NOT NULL |
控制是否允许空值 | 默认允许空值,NOT NULL强制非空 |
DEFAULT |
设置字段默认值 | 字面量或表达式 |
PRIMARY KEY |
唯一标识每条记录的主键约束 | 单列或多列组合 |
FOREIGN KEY |
建立与其他表的关联关系 | REFERENCES + 目标表.目标列 |
CHECK |
自定义校验规则 | 逻辑表达式 |
UNIQUE |
确保字段值唯一性 | 适用于非主键字段 |
INDEX |
加速查询效率 | BTREE, HASH等索引类型 |
完整语法结构
CREATE TABLE schema_name.table_name (
column1 datatype [constraint],
column2 datatype [constraint],
...,
[PRIMARY KEY (column_list)],
[FOREIGN KEY (fk_column) REFERENCES ref_table(ref_column)],
[CHECK (condition)],
[INLINE/OUT OF LINE] -索引存储方式
) [IN database_name] [WITH ...] -可选参数
关键子句说明:
-
基础列定义
id INTEGER NOT NULL, -自增ID username VARCHAR(50) UNIQUE, -用户名唯一 email VARCHAR(100) DEFAULT 'example@domain.com', -默认邮箱 balance DECIMAL(10,2) CHECK (balance >= 0) -余额不能为负
-
主键约束
两种方式等价:
PRIMARY KEY (id) -显式声明 -或直接标注在列定义后 id INTEGER PRIMARY KEY
-
外键约束
dept_id INTEGER, FOREIGN KEY (dept_id) REFERENCES departments(id) ON DELETE CASCADE
ON DELETE CASCADE:删除部门时自动级联删除员工记录- 其他动作:
SET NULL,RESTRICT(默认阻止删除)
-
复合主键

PRIMARY KEY (order_date, product_code) -联合主键
-
生成列(DB2 v12+支持)
full_name VARCHAR(100) AS (first_name || ' ' || last_name) -自动拼接姓名
实战示例
示例1:基础员工表
CREATE TABLE employees (
emp_id INTEGER PRIMARY KEY,
first_name VARCHAR(30) NOT NULL,
last_name VARCHAR(30) NOT NULL,
hire_date DATE DEFAULT CURRENT DATE,
salary DECIMAL(8,2) CHECK (salary > 3000),
dept_id INTEGER,
FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);
示例2:带分区的大事实表(按月份分区)
CREATE TABLE sales_fact (
sale_id BIGINT PRIMARY KEY,
product_id INTEGER,
store_id INTEGER,
sale_amount DECIMAL(12,2),
sale_date DATE,
month_num GENERATED ALWAYS AS (MONTH(sale_date)) -提取月份作为虚拟列
)
PARTITION BY RANGE (month_num) (
STARTING FROM 1 ENDS AT 12 EACH 1 -按月分区
);
示例3:临时表(会话级存在)
CREATE GLOBAL TMPORARY TABLE temp_audit_log (
log_time TIMESTAMP DEFAULT CURRENT TIMESTAMP,
action VARCHAR(20),
user_id INTEGER
) ON COMMMIT RETAIN NEXT; -事务提交后保留一次访问周期
最佳实践建议
| 场景 | 推荐方案 | 原因 |
|---|---|---|
| 敏感信息加密 | 使用 BINARY + 应用层加密 |
DB2原生不支持透明加密 |
| 高频更新字段 | 单独建立索引 | 减少锁竞争 |
| 历史归档表 | 采用压缩表空间(COMPRESSYES) | 节省存储空间 |
| 地理坐标存储 | POINT/POLYGON等空间数据类型(需启用DB2 Spatial Extender) | 支持空间索引和距离计算 |
| JSON文档存储 | CLOB + JSON_DOCUMENT函数 | DB2 v11.1+原生支持JSON处理 |
| 大文本字段 | CLOB(n) / DBCLOB(n) | 根据实际长度选择合适类型 |
常见错误及解决方案
| 错误现象 | 可能原因 | 解决方法 |
|---|---|---|
| SQLSTATE=42601 语法错误 | 缺少逗号/括号不匹配 | 使用工具格式化SQL语句 |
| SQLSTATE=428A4 重复对象名 | 表名/列名已存在 | 添加模式前缀或修改对象名 |
| SQLSTATE=428B9 外键引用失败 | 被引用表不存在/列类型不一致 | 检查依赖关系顺序,统一数据类型 |
| SQLSTATE=428C9 CHECK约束违反 | 插入数据不符合校验规则 | 调整默认值或放宽约束条件 |
| ORA-01536: space quota exceeded | 表空间不足 | 扩展表空间或清理无用数据 |
相关问答FAQs
Q1: 如何修改已存在的表结构?
A: 使用 ALTER TABLE 命令:
- 添加新列:
ALTER TABLE employees ADD COLUMN middle_name VARCHAR(30) - 修改列属性:
ALTER TABLE employees ALTER COLUMN salary SET NOT NULL - 删除列:
ALTER TABLE employees DROP COLUMN temp_flag - 注意:修改主键/外键等约束可能需要重建索引,建议在低峰期操作。
Q2: 如何选择最适合的数据类型?
A: 根据业务需求权衡精度和存储成本:

- 整数类型:SMALLINT(2字节) < INTEGER(4字节) < BIGINT(8字节)
- 字符串:CHAR(固定长) vs VARCHAR(变长) → 短文本用CHAR,长文本用VARCHAR(最大32KB)
- 浮点数:FLOAT(双精度) vs DOUBLE(更高精度) vs DECIMAL(精确小数位)
- 日期时间:TIMESTAMP(含时分秒) > TIME(仅时间) > DATE(仅日期)
- 特殊类型:XML、BLOB(二进制大对象)、GRA
