PostgreSQL执行INSERT语句提示已存在的表约束不存在问题求助
问题原因
你创建的minutes_clone_stick_tickers_unique是唯一索引,而ON CONFLICT ON CONSTRAINT仅支持匹配表级约束(如PRIMARY KEY、UNIQUE约束),二者不属于同一类对象,因此PostgreSQL会报约束不存在的错误。
解决方案
方案一:直接指定冲突列(推荐,无需修改现有表结构)
修改INSERT语句的冲突判定逻辑,直接填写唯一索引对应的列组即可,PostgreSQL会自动匹配对应的唯一索引触发更新:
INSERT INTO minutes_clone (date, ticker, "lastTime", "openTime", date_time, group_type, "totalVolume", "totalPrice", "totalTrades") VALUES('2021-07-02', 'YELP', '00:15:00', '00:00:00', '2021-07-02 00:00:00', 15, 0, 0, 0) ON CONFLICT ("date", "ticker", "openTime", "group_type") DO UPDATE SET "lastTime" = '00:15:00', "openTime" = '00:00:00', date_time = '2021-07-02 00:00:00', "totalVolume" = 0, "totalPrice" = 0, "totalTrades" = 0 RETURNING id;
方案二:将唯一索引改为UNIQUE约束(适配原有INSERT写法)
如果需要保留ON CONSTRAINT的写法,可以先删除现有唯一索引,再添加同名的UNIQUE约束:
- 删除原有唯一索引:
DROP INDEX IF EXISTS minutes_clone_stick_tickers_unique;
- 添加同名UNIQUE约束:
ALTER TABLE minutes_clone ADD CONSTRAINT minutes_clone_stick_tickers_unique UNIQUE ("date", "ticker", "openTime", "group_type");
操作完成后原有INSERT语句即可正常执行。
排查验证
如果修改后仍有异常,可以执行以下语句确认当前表的约束、索引信息,确认名称拼写、大小写、所属schema是否匹配:
- 查询表下所有约束:
SELECT conname FROM pg_constraint WHERE conrelid = 'minutes_clone'::regclass;
- 查询表下所有索引:
SELECT indexname FROM pg_indexes WHERE tablename = 'minutes_clone';
内容的提问来源于stack exchange,提问作者LilBiscuit21
相关产品推荐
相关产品推荐

