PostgreSQL如何修改timestamp类型列并设置为非空?
PostgreSQL给timestamptz列添加NOT NULL约束的正确方法
你之前的语句错误原因是将修改数据类型的TYPE子句和设置非空约束的逻辑混写了,TYPE关键字仅用于变更列的数据类型,你的creation_time列本身已经是timestamp(6) with time zone类型,不需要修改类型,直接单独设置非空约束即可。
情况1:表中creation_time列已不存在NULL值
直接执行以下语句即可完成设置:
ALTER TABLE my_table ALTER COLUMN creation_time SET NOT NULL;
情况2:表中creation_time列仍存在NULL值
需要先将所有NULL值填充为合法值,再添加非空约束,示例操作如下:
- 填充NULL值(以下示例将NULL值统一设为当前时间,可根据业务需求修改为其他值)
UPDATE my_table SET creation_time = CURRENT_TIMESTAMP WHERE creation_time IS NULL;
- 执行设置非空约束的语句
ALTER TABLE my_table ALTER COLUMN creation_time SET NOT NULL;
如果需要同时给列添加默认值,避免后续插入数据时未赋值触发非空约束报错,可以额外执行:
ALTER TABLE my_table ALTER COLUMN creation_time SET DEFAULT CURRENT_TIMESTAMP;
注意事项
- 执行
SET NOT NULL时PostgreSQL会扫描全表校验所有行的该列都没有NULL值,如果表数据量很大,会触发全表锁,建议在业务低峰期操作。
内容的提问来源于stack exchange,提问作者samshers
相关产品推荐
相关产品推荐

