当前位置:首页 > 数据库 > 正文

数据库怎么创建表 db2

在 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 ...] -可选参数

关键子句说明:

  1. 基础列定义

    id INTEGER NOT NULL, -自增ID username VARCHAR(50) UNIQUE, -用户名唯一 email VARCHAR(100) DEFAULT 'example@domain.com', -默认邮箱 balance DECIMAL(10,2) CHECK (balance >= 0) -余额不能为负
  2. 主键约束

    两种方式等价:

    PRIMARY KEY (id) -显式声明 -或直接标注在列定义后 id INTEGER PRIMARY KEY
  3. 外键约束

    数据库怎么创建表 db2 第1张

    dept_id INTEGER, FOREIGN KEY (dept_id) REFERENCES departments(id) ON DELETE CASCADE
    • ON DELETE CASCADE:删除部门时自动级联删除员工记录
    • 其他动作:SET NULL, RESTRICT(默认阻止删除)
  4. 复合主键

    数据库怎么创建表 db2 第2张

    PRIMARY KEY (order_date, product_code) -联合主键
  5. 生成列(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

数据库怎么创建表 db2 第3张

0