java - Postgres UPSERT 和 id SERIAL 问题
问题描述
创建表:
CREATE TABLE tests (id SERIAL PRIMARY KEY, "name" VARCHAR);
UPSERT:
INSERT INTO tests (id, "name")
VALUES (?, ?)
ON CONFLICT (id) DO UPDATE
SET "name" = EXCLUDED."name";
问题是它从不执行 UPDATE 部分,因为 SERIAL 类型解决了所有冲突 - 它只是将现有记录插入为具有新 id (nextval) 的新记录,而不是更新它们。
我正在尝试实现“保存所有记录”功能。如果它们不存在,它应该更新现有记录并插入新记录。
我想象的算法:
connection.setAutoCommit(false);
for (Test test : tests)
{
statement = connection.prepareStatement("INSERT INTO tests (id, \"name\") VALUES (?, ?) ON CONFLICT (id) DO UPDATE SET \"name\" = EXCLUDED.\"name\";");
statement.setInt(1, test.getId());
statement.setString(2, test.getName());
statement.execute();
}
connection.commit();
解决方案
推荐阅读
- go - 如果我的客户端和服务器已经支持每个消息压缩压缩,我是否需要通过 JSON 使用 messagePack 序列化?
- php - Ajax 和 Laravel 500(内部服务器错误)
- excel - 除了用户输入的内容之外,我如何附加这个值?
- hibernate - Hibernate Validation Framework 无法加载 javax PersistenceProvider
- python - 当特定键的值重复时,Python 删除字典项
- wcf - WCF 方法在其 HTTP 动词为 PUT 或 DELETE 时被调用两次
- php - 如何自动刷新 PHP 会话变量
- javascript - 隐藏溢出后环绕文本消失
- python-3.x - gio: file:///tmp/....pdf: 没有应用程序注册为处理此文件
- python - 在 `pyarrow` 测试中使用内存文件系统