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

数据库怎么创建表 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. 主键约束
    两种方式等价:

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

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

    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: 根据业务需求权衡精度和存储成本:

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

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