【问题标题】:Only adding non-duplicate values to PostgreSQL table仅向 PostgreSQL 表添加非重复值
【发布时间】:2020-08-21 20:20:29
【问题描述】:

我想知道在 PostgreSQL 数据库表中避免重复的最佳做法是什么。表中的行相当于一天中多次调用的第 3 方 API 中的条目。

我只添加不与 JSON 响应重复的条目。 JSON 响应可以是数据库中超过 500 个对象,比如说:

[{
  "unique_id": 1234,
  "name": "A",
  "wins": 1
},
{
  "unique_id": 1235
  "name": "B",
  "wins": 1
}, 
... 
];

问题是来自 API 的数据可能是我已经存储在数据库中的数据,当我再次查询第 3 方端点时,我不想拥有已经存储的数据再次插入 - 只有结果中的唯一对象。

而且我知道如何检查一个单独的对象是否连续存在,但是当我在第 3 方响应中有超过 500 个并且其中只有 50 个是唯一的时,合理的检查是什么在一个数据库事务中?

我很想去SELECT * FROM table_name,将这些结果添加到 json 响应中,然后以这种方式删除重复项,但这似乎是一个非常多的开销处理。

任何帮助将不胜感激。

【问题讨论】:

    标签: sql postgresql duplicates sql-insert knex.js


    【解决方案1】:

    一个简单的方法是声明一个引用表中相关列的唯一约束(或唯一索引或主键)。您可以在 insert 查询中使用 on conflict do nothing 子句:

    例子:

    create table mytable(unique_id int, name text, wins int);
    create unique index myidx on mytable(unique_id, name, wins);
    
    insert into mytable (unique_id, name, wins) 
    values(1234, 'A', 1)
    on conflict(unique_id, name, wins) do nothing;
    

    【讨论】:

      【解决方案2】:

      在需要唯一的列上设置UNIQUE 约束,然后插入ON CONFLICT DO NOTHING(或ON CONFLICT DO UPDATE,如果您不知道这是一个选项,但这是您真正想要的做)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-22
        • 1970-01-01
        • 1970-01-01
        • 2021-07-19
        • 2020-02-23
        相关资源
        最近更新 更多