首页 > 解决方案 > Heroku PostgreSQL:重新启动添加重复行

问题描述

我有一个使用 PostgreSQL 插件在 Heroku 上运行的 Spring Boot 应用程序。在启动时,spring boot 会自动在 PostgreSQL 中创建一些虚拟数据,例如用户及其联系信息。表和插入语句存储在Schema.sql (pastebin)Data.sql (pastebin)

在第一次启动时一切正常,但在我重新启动它之后,spring boot 应用程序再次创建相同的行,这会导致出现重复行、重复关系等错误。

如何在重新启动时禁用数据娱乐?

Heroku Config Vars设置为:

在此处输入图像描述

每个 SQL 插入语句都有ON CONFLICT DO NOTHING,每个创建表语句都有IF NOT EXISTS

标签: postgresqlspring-bootheroku

解决方案


虽然@richyen 已经正确识别了问题,但我会建议一个不同的解决方案:修复您的架构并为您的用户使用自然键,而不是(或至少除此之外)代理serial

CREATE TABLE IF NOT EXISTS users(
  id SERIAL PRIMARY KEY,
  username varchar(255) UNIQUE NOT NULL,
--                      ^^^^^^
  email varchar(255) UNIQUE NOT NULL,
--                   ^^^^^^
  PASSWORD varchar(255) NOT NULL,
  enabled INTEGER DEFAULT 0,
  created_at TIMESTAMP,
  modified_at TIMESTAMP,
  removed_at TIMESTAMP
);

(APRIMARY KEY与 完全相同UNIQUE NOT NULL,只是您只能拥有一次,并且它成为对未显式指定列的表的外键引用的默认值)。

当您尝试插入具有相同名称或电子邮件地址的用户时,这将导致预期的冲突。


推荐阅读