数据库怎么创建表 db2
- 数据库
- 2025-08-11
- 6
核心要素详解
| 组成要素 | 作用说明 | 典型取值范围 |
|---|---|---|
| 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
