SAP HANA CREATE TABLE 速查手册(开发 / 运维直用)

一、表类型选型(优先级 + 场景)

表格

表类型 关键字 适用场景 关键特性
列存储表(推荐) COLUMN TABLE 大数据、报表、聚合、分析查询 默认自动合并、支持分区 / 压缩,HANA 主流
行存储表 ROW TABLE 小配置表、码表、单条全字段查询 默认类型,不适合海量数据
历史表(时间旅行) HISTORY COLUMN TABLE 需查询历史数据、数据回溯 必须建主键;仅支持查询,会话需开启历史模式
全局临时表 GLOBAL TEMPORARY 跨会话共用表结构、会话隔离数据 元数据持久,会话结束数据清空;支持增删改查
本地临时表 LOCAL TEMPORARY 仅当前会话使用 结构 + 数据会话隔离,会话结束自动清理

口诀:分析用列存,小表用行存,回溯用历史表,临时业务用全局临时表

二、基础语法模板

1. 常规建表(列定义)

sql

复制代码
-- 列存储(通用业务表)
CREATE COLUMN TABLE 模式名.表名 (
  列名 数据类型 [约束] [DEFAULT 默认值],
  列名 数据类型 [GENERATED ALWAYS AS 表达式], -- 计算列
  [表级约束]
)
[LOGGING | NO LOGGING]       -- 日志开关
[AUTO MERGE | NO AUTO MERGE] -- 增量合并开关
[PARTITION BY 分区规则]      -- 分区
[AT LOCATION '主机:端口'];    -- 分布式指定节点

2. 复制表结构 / 数据

sql

复制代码
-- 仅复制结构(默认 WITH NO DATA)
CREATE TABLE 新表 LIKE 源表;
-- 结构+数据全复制
CREATE TABLE 新表 LIKE 源表 WITH DATA;

-- 基于查询结果建表(仅继承 NOT NULL 约束)
CREATE TABLE 新表 AS (SELECT 列 FROM 源表) [WITH NO DATA | WITH DATA];

三、列与约束规范

1. 常用数据类型

  • 整型:TINYINT/SMALLINT/INTEGER/BIGINT
  • 浮点 / 精度数值:DECIMAL/REAL/DOUBLE
  • 字符:VARCHAR(单字节) / NVARCHAR(多语言 / 推荐)
  • 时间:DATE/TIME/SECONDDATE/TIMESTAMP
  • 大对象:BLOB(二进制)、CLOB/NCLOB(大文本)

2. 约束(索引类型)

  • NULL/NOT NULL:是否允许空,默认 NULL
  • UNIQUE:唯一约束
  • PRIMARY KEY:主键(非空 + 唯一,历史表强制要有
  • 索引后缀:BTREE(普通 B + 树)、CPBTREE(压缩前缀 B + 树,长字符 / 复合键优先)

3. 特殊列

  • 默认值:列名 类型 DEFAULT '值'
  • 计算列:列名 类型 GENERATED ALWAYS AS (表达式)

四、核心开关配置

  1. 日志模式
    • LOGGING(默认):记录事务日志,支持故障恢复;正式业务表必选
    • NO LOGGING:无日志、写入更快,异常数据丢失风险高;仅临时 / 中间表使用
  2. 增量合并
    • AUTO MERGE(默认):列存表自动合并 Delta 区,常规场景保留
    • NO AUTO MERGE:关闭自动合并,大批量导入数据时临时使用

五、分区语法(海量数据必备)

1. 分区类型 & 用法

  • RANGE 范围分区 :时间、有序数值(最常用)

    sql

    复制代码
    PARTITION BY RANGE(分区列) (
      PARTITION '2024-01-01' <= VALUES < '2025-01-01',
      PARTITION VALUE = '2025-02-01',
      PARTITION OTHERS -- 兜底分区
    )
  • HASH 哈希分区 :数据均匀打散,无顺序要求

    sql

    复制代码
    PARTITION BY HASH(列1,列2) PARTITIONS 分区数
  • ROUNDROBIN 轮询分区 :纯均衡分发,不依赖字段

    sql

    复制代码
    PARTITION BY ROUNDROBIN PARTITIONS 分区数

2. 多级分区:支持 HASH+RANGE 组合

六、临时表操作限制

  1. GLOBAL TEMPORARY 支持:建表、重命名、增删改查、索引、视图、同义词、TRUNCATE/DROP 限制:无数据时才能删表;数据会话隔离
  2. LOCAL TEMPORARY 支持:建表、增删改查、TRUNCATE/DROP 限制:结构 & 数据仅当前会话可见,功能少于全局临时表

七、历史表「时间旅行」用法

  1. 前提:表为 HISTORY COLUMN TABLE + 建有主键

  2. 会话级回溯(整会话查询历史数据) sql

    复制代码
    SET HISTORY SESSION TO UTCTIMESTAMP 'UTC时间戳';
    -- 或基于提交ID
    SET HISTORY SESSION TO COMMIT ID 数值;
    -- 退出历史会话:执行 COMMIT / ROLLBACK
  3. 语句级回溯(单条查询指定时间点) sql

    复制代码
    SELECT * FROM 历史表 AS OF UTCTIMESTAMP 'UTC时间戳';
  4. 补充规则

    • 历史会话必须关闭自动提交
    • 非历史表始终查询当前数据
    • 仅允许 SELECT,不可 DML/DDL

八、生产最佳实践(落地规范)

  1. 常规业务表:统一使用 COLUMN TABLE,必建主键,保留 LOGGING + AUTO MERGE
  2. 小字典 / 配置表:使用 ROW TABLE
  3. 需数据回溯审计:选用 HISTORY COLUMN TABLE,提前规划主键
  4. 会话级临时计算数据:优先 GLOBAL TEMPORARY
  5. 千万级以上大表:强制分区,时间维度优先 RANGE 分区
  6. 大批量导入场景:临时开启 NO AUTO MERGE + NO LOGGING,导入完成改回默认
  7. 字符字段:多语言环境统一用 NVARCHAR

九、高频示例(直接复制运行)

sql

复制代码
-- 1. 标准列存业务表
CREATE COLUMN TABLE TEST_USER (
    USER_ID INT PRIMARY KEY,
    USER_NAME NVARCHAR(50) NOT NULL,
    CREATE_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) LOGGING AUTO MERGE;

-- 2. 时间范围分区表
CREATE COLUMN TABLE SALE_DATA (
    ID INT,
    SALE_DATE DATE,
    AMOUNT DECIMAL(18,2),
    PRIMARY KEY(ID, SALE_DATE)
) PARTITION BY RANGE(SALE_DATE) (
    PARTITION '2025-01-01' <= VALUES < '2025-07-01',
    PARTITION OTHERS
);

-- 3. 全局临时表
CREATE GLOBAL TEMPORARY TABLE TMP_DATA (
    COL1 INT,
    COL2 NVARCHAR(100)
);

-- 4. 历史回溯表
CREATE HISTORY COLUMN TABLE HIS_LOG (
    LOG_ID INT PRIMARY KEY,
    CONTENT NCLOB
);
相关推荐
日取其半万世不竭6 小时前
用 Portainer 可视化管理 Docker:容器再多也不用背命令了
运维·docker·容器
kirs_ur7 小时前
ECC & LDPC — SSD 的数据卫士
服务器·数据库·性能优化
是三一seven8 小时前
Sql注入基础
数据库·安全·网络安全
Sirens.8 小时前
MySQL表设计进阶-约束范式连接索引与事务
android·数据库·mysql
动恰客流统计9 小时前
ReID边缘计算视觉统计:餐饮店客流增长的数字化破局路径
java·大数据·运维·人工智能
字节跳动开源10 小时前
火山引擎开源 Agent 驱动的搜索自迭代技术
数据库·开源·agent
Oo大司命oO12 小时前
藏在正则表达式里的陷阱
数据库·mysql·正则表达式
_oP_i13 小时前
mysql统计数据库使用存储大小
数据库
会编程的土豆13 小时前
MySQL 入门:库、表、行、主键是什么
linux·数据库·网络协议·http
jjjava2.013 小时前
系统日志:从入门到精通的完整指南
网络·数据库