DB2中如何为新增列设置基于现有列表达式的默认值?
DB2新增列时使用现有列或复杂表达式作为默认值的可行性
一、能否用现有列数据作为新增列的默认值?
DB2不支持直接在ALTER TABLE的DEFAULT子句里引用现有列作为新增列的默认值。比如你尝试执行以下语句:
ALTER TABLE employees ADD COLUMN work_hours INT DEFAULT (man_days);
会直接触发语法错误——因为DB2要求DEFAULT后的表达式必须是常量表达式,不能依赖表中其他列的动态值。
如果要实现用现有列值初始化新增列的需求,得拆成两步操作:
- 先添加不带默认值的列:
ALTER TABLE employees ADD COLUMN work_hours INT;
- 再通过
UPDATE语句用现有列值填充新增列:
UPDATE employees SET work_hours = man_days;
二、能否使用引用其他列的复杂表达式作为默认值?
同样不行。像你提供的包含CASE逻辑且引用salary、man_days列的表达式,放在DEFAULT子句里会报错:
ALTER TABLE employees ADD COLUMN work_hours INT DEFAULT ( CASE WHEN salary < 50000 THEN (man_days + 10) * 24 WHEN salary >= 50000 THEN (man_days) * 24 END);
原因还是一样:DEFAULT只接受不依赖表内其他列的常量表达式,这类涉及其他列的复杂逻辑不符合要求。
要实现这种逻辑,同样采用两步法:
- 先添加空列:
ALTER TABLE employees ADD COLUMN work_hours INT;
- 用
UPDATE结合复杂表达式完成数据初始化:
UPDATE employees SET work_hours = CASE WHEN salary < 50000 THEN (man_days + 10) * 24 WHEN salary >= 50000 THEN man_days * 24 END;
内容的提问来源于stack exchange,提问作者G 1
相关产品推荐
相关产品推荐

