postgresql - 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
解决方案
虽然@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
,只是您只能拥有一次,并且它成为对未显式指定列的表的外键引用的默认值)。
当您尝试插入具有相同名称或电子邮件地址的用户时,这将导致预期的冲突。
推荐阅读
- android - SharedPreferences 只保存默认值
- javascript - 比较两个约会数组并消除冲突
- c++ - 在类中将函数作为参数传递时出错
- javascript - discord.js 无限清除命令
- c# - WPF(.NET-Core):如何以编程方式将按钮背景颜色绑定到矩阵的索引值?
- c++ - 从 txt 文件中读取变量并将它们作为数组保存到类对象中 c++
- python - 将 discord bot 暴露给 API (Flask, FASTAPI)
- haskell - cabal 似乎没有注册已安装的软件包
- javascript - React Router 根据 URL 渲染信息
- angular - 从 angular 7 升级到 angular 8 或 10 会导致问题