数据库对象命名往往受限于长度和命名规范,一张表里的字段叫CUST_ST、ORD_TP,单看名字很难知道具体含义。如果没有注释,接手项目的人只能翻文档或者问老员工,效率非常低。DB2提供了COMMENT ON语句来解决这个问题,它可以给表、视图、字段、索引、序列等几乎所有数据库对象添加说明文字,而且可以随时修改,是数据库规范化管理中不可忽视的一个环节。

COMMENT ON的基本语法与常见用法
COMMENT ON语句的语法结构比较直观,核心形式是先指定对象类型和对象名,再用IS关键字接一段字符串作为注释内容。给表添加注释的写法如下:
-- 给表添加注释 COMMENT ON TABLE EMPLOYEE IS '员工基本信息表,包含在职和离职员工'; -- 给字段添加注释 COMMENT ON COLUMN EMPLOYEE.EMP_ID IS '员工工号,主键,公司内部唯一'; COMMENT ON COLUMN EMPLOYEE.DEPT_CODE IS '所属部门编码,关联DEPARTMENT表';
需要注意的是,注释字符串要用单引号包裹,最长支持254字节。对于中文字符,GBK编码下一个汉字占两个字节,UTF-8下占三个字节,所以中文注释大约只能写80个左右的汉字。如果超长,DB2会直接报SQLSTATE 22001错误,提示字符串被截断,这时需要精简注释内容。
除了表和字段,COMMENT ON还支持视图、别名、序列、触发器、存储过程、索引、约束、分区等多种对象。比如给视图和序列加注释:
COMMENT ON VIEW V_EMP_ACTIVE IS '在职员工视图,过滤掉离职状态数据'; COMMENT ON SEQUENCE SEQ_ORDER_ID IS '订单号序列,起始100000,步长1'; COMMENT ON INDEX IDX_EMP_NAME IS '员工姓名索引,加速按姓名查询';
一个实用的技巧是可以一次性给一个表的多个字段写注释,但DB2并不支持在一条语句里列多个COLUMN,只能逐条执行。如果注释内容包含单引号本身,需要写成两个连续的单引号进行转义,例如COMMENT ON COLUMN T.A IS '备注''字段',这样注释内容实际是"备注'字段"。
修改、删除注释以及查询已有注释
COMMENT ON语句的一个便利之处在于,对同一个对象重复执行时,新注释会直接覆盖旧注释,不需要先删除再添加。这一点和某些数据库的ALTER语法不同,DB2没有单独的删除注释语句,如果想清除注释,把注释设为空字符串即可,例如COMMENT ON TABLE EMPLOYEE IS ''。执行后系统目录表中该表的REMARKS字段就变成空值了。
注释信息最终存储在系统目录表里,查询这些目录表就能看到已有注释。表级注释存放在SYSCAT.TABLES的REMARKS列,字段注释存放在SYSCAT.COLUMNS的REMARKS列。常用查询写法:
-- 查询某个表的所有字段注释 SELECT COLNAME, REMARKS FROM SYSCAT.COLUMNS WHERE TABSCHEMA = 'DB2INST1' AND TABNAME = 'EMPLOYEE' ORDER BY COLNO; -- 查询当前模式下的表注释 SELECT TABNAME, REMARKS FROM SYSCAT.TABLES WHERE TABSCHEMA = CURRENT SCHEMA AND TYPE = 'T';
这里要注意模式名和表名在目录表中默认是大写存储的,除非建表时用了双引号包裹的小写名称。查询时如果条件里写小写会查不到数据,这是初学者常踩的坑。另外,在命令行里如果只想快速看某个表的结构和注释,直接执行DESCRIBE TABLE EMPLOYEE也能列出字段和注释信息,比写查询语句更省事。
权限方面,执行COMMENT ON需要对目标对象持有ALTER权限,或者是对象的定义者。普通开发人员如果报权限不足的错误,需要找DBA授权,这一点在多人协作的项目里要提前沟通好。
结合建表脚本和工具批量管理注释
在实际项目中,更推荐把COMMENT ON语句写进建表脚本,让注释成为表结构定义的一部分。这样脚本在任何环境执行后,注释都完整存在,避免只在线上手工加过、测试环境却没有的情况。一个规范的建表脚本示例如下:
CREATE TABLE ORDER_INFO (
ORDER_ID CHAR(20) NOT NULL,
CUST_ID CHAR(10) NOT NULL,
ORDER_DATE DATE NOT NULL,
ORDER_AMT DECIMAL(12,2),
PRIMARY KEY (ORDER_ID)
) IN USERSPACE1;
COMMENT ON TABLE ORDER_INFO IS '订单主表';
COMMENT ON COLUMN ORDER_INFO.ORDER_ID IS '订单编号,格式OD+日期+流水号';
COMMENT ON COLUMN ORDER_INFO.CUST_ID IS '客户编号,关联客户主档';
COMMENT ON COLUMN ORDER_INFO.ORDER_DATE IS '下单日期';
COMMENT ON COLUMN ORDER_INFO.ORDER_AMT IS '订单金额,单位元,保留两位小数';
如果项目里已经有大量表没加注释,手工逐条写显然不现实。可以利用目录表反向生成COMMENT ON语句,先把表名和字段名查出来拼成SQL文本,再批量执行。有些图形化管理工具也提供可视化编辑注释的功能,选中表后在属性面板的注释输入框里填写并保存,工具底层执行的仍然是COMMENT ON语句,效果完全一样。
还有一点经验值得分享:注释内容尽量写业务含义而不是翻译字段名。比如字段叫ORDER_AMT,注释写"订单金额"意义不大,多写一句"含运费,不含优惠折扣"才真正对后续维护有帮助。数据字典类的注释管理做好了,配合查询目录表的SQL,随时可以导出一份完整的数据库说明文档,比手工维护Word文档可靠得多。
总的来说,COMMENT ON是DB2中成本极低但收益很高的功能,语句简单、可随时修改、查询方便。养成建表必加注释的习惯,配合版本化的建表脚本,能让数据库结构长期保持清晰可读,团队协作的沟通成本也会明显降低。
DB2COMMENT ON表注释修改时间:2026-09-08 07:10:37