Redshift Update语句从保留关键字timestamp列取值赋值问题咨询
Redshift保留字列名UPDATE操作解决方案
- 首先明确引号的作用边界:Redshift中
双引号用于包裹表、列等标识符,单引号用于包裹字符串常量,你之前加引号后被识别为字符串大概率是误用了单引号。 - 引用保留字作为列名时,双引号内的列名大小写必须和建表时定义的列名完全一致,大小写不匹配也会导致引用失败。
- 原列是varchar类型,转成timestamp类型需要显式做类型转换,避免隐式转换报错,同时注意
UPDATE后直接跟实际表名,不要写table关键字,正确的语句如下:
-- 替换为实际的表名 UPDATE 你的实际表名 SET timestamp_dt = "timestamp"::timestamp without time zone;
- 执行前可先运行测试语句验证列名引用是否正确:
-- 替换为实际的表名 SELECT "timestamp" FROM 你的实际表名 LIMIT 10;
如果查询能正常返回原列数据,说明列名引用正确,再执行UPDATE操作即可。
- 大表优化建议:由于Redshift的存储机制特性,全量UPDATE大表会产生大量IO、长时间锁表,建议优先选择建表替换的方式完成字段转换,效率更高:
-- 替换为实际的新表名、原表名,补全所有需要保留的字段 CREATE TABLE 新表名 AS SELECT 其余需要保留的字段, "timestamp"::timestamp without time zone AS timestamp_dt FROM 原表名; -- 验证新表数据无误后,执行重命名操作 ALTER TABLE 原表名 RENAME TO 原表名_bak; ALTER TABLE 新表名 RENAME TO 原表名;
内容的提问来源于stack exchange,提问作者Irshad Ali
相关产品推荐
相关产品推荐

