如何避免 Postgres 数据库中的重复条目?条目包含不同的值

Posted

技术标签:

【中文标题】如何避免 Postgres 数据库中的重复条目?条目包含不同的值【英文标题】:How to avoid duplicate entries in Postgres database? Entries contain varying value 【发布时间】:2018-04-17 19:00:01 【问题描述】:

实体存储方法:

PoolDef poolDef = new PoolDef();
        poolDef.setDate_from(date);
        poolDef.setName(poolList.getPoolList().get(i).getName());

        poolDefRepository.save(poolDef);

实体本身:

@Setter
@Getter
@EqualsAndHashCode(of = "Id")
@Transactional
@Entity
public class PoolDef 

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long Id;

private String name;

@Column(name = "date_from", columnDefinition = "timestamp with time zone not null")
private OffsetDateTime date_from;

唯一不同的值是date_from。我不知道,为什么新条目被添加到数据库中,而不仅仅是更新。我有基于主要Id 键构建的@EqualsAndHashcode,因此date_from 应该无关紧要。每个方法调用都会创建一个新条目,其中包含一个全新的 Id...

【问题讨论】:

您创建新实体并将其保存到数据库。为什么它不应该有新的 ID? 来自CRUD repositorysave 方法是这样编码的,如果实体是新的,它将在EntityManager 上调用persist。否则为merge。我有一个自定义EqualsAndHashCode,所以它应该被视为相同,不是吗?我是初学者,所以请证明我错了。 你是对的。从您的代码中,您的实体是新的。 PoolDef poolDef = new PoolDef(); 你的 EqualsAndHashCode 使任何具有相同 ID 的实例都等于。 【参考方案1】:

你的问题是你的

GenerationType.IDENTITY

文档说:

表示持久化提供者必须为 使用数据库标识列的实体。

现在的关键问题是,生成了什么 SQL。能否请您跟踪生成的插入 SQL?

另外我更喜欢使用 SEQUENCES 的数据库。因此,我不必弄乱持久性提供程序的身份,如果您将数据库的 SEQUENCES 用于您的 ID/主键列,那么任何应用程序对数据库的行为都会相同。

还有一个问题可能是您用于创建表的 DDL,但我假设您知道如何使用给定的约束定义数据库表。

【讨论】:

以上是关于如何避免 Postgres 数据库中的重复条目?条目包含不同的值的主要内容,如果未能解决你的问题,请参考以下文章

Swift:如何避免 CoreData 中的重复条目以使用 JSON 数组实现?

如何在 Swift 中使用区分大小写和不区分大小写的混合字符串避免 Array 中的重复条目?

从 postgres 数据库中删除重复条目

如何避免没有主键和唯一键的重复条目?

避免在 ios 中的 UITableView 中出现重复条目

如何停止模式对话框中的重复条目