PostgreSQL如何将现有VARCHAR类型列修改为整数外键
解决方案
你遇到的报错是因为PostgreSQL不支持隐式的整数和字符串类型等值比较,同时matches表的event_id字段类型不符合外键关联要求,按以下步骤可快速修改为整数外键:
步骤1:校验event_id字段数据合法性
修改类型前先确认所有event_id存储的都是合法整数,没有非数字内容,执行以下查询:
SELECT * FROM matches WHERE event_id !~ '^[0-9]+$';
如果查询无返回结果,说明数据无异常,可继续下一步。如果有返回结果,需要先清理这些脏数据后再操作。
步骤2:修改event_id字段类型为整数
执行ALTER语句修改字段类型,通过USING子句指定字符串转整数的规则:
ALTER TABLE matches ALTER COLUMN event_id TYPE INTEGER USING event_id::INTEGER;
步骤3:添加外键约束
字段类型修改完成后,即可添加外键关联events表的id字段:
ALTER TABLE matches ADD CONSTRAINT fk_matches_event FOREIGN KEY (event_id) REFERENCES events(id);
临时解决方案(无需修改表结构)
如果暂时不想调整表结构,可在关联查询时手动显式转换类型规避报错:
SELECT * FROM matches JOIN events ON events.id = matches.event_id::INTEGER;
注意:临时方案不会用到event_id上的索引,数据量大时查询性能会受影响,建议优先采用修改字段类型加外键的方案。
内容的提问来源于stack exchange,提问作者Dan Zuzevich
相关产品推荐
相关产品推荐

