sql - Postgres 9.4——在向表中插入行时如何忽略重复键

标签 sql postgresql postgresql-9.4

我有一个像这样的 story_id 表。

    Column    |  Type   |                             Modifiers
--------------+---------+-------------------------------------------------------------------
 id           | integer | not null default nextval('story_sites_id_seq'::regclass)
 story_id     | integer | not null
 site_id      | integer | not null

我想用 site_id = 12story_id 添加新行,它已经有 site_id = 70 ,这是我的查询,它有效嗯:

INSERT INTO story_sites (story_id, site_id)
SELECT story_id, 12
FROM story_sites
WHERE site_id = 70;

但是如果有些行已经有 site_id = 12,我会得到重复键错误。

所以我想排除那些重复的行,这是我的新查询,但是它不能正常工作,它在我认为应该插入的时候什么都不插入。此外,我似乎无法在 Postgres 9.4 中使用 ON CONFLICT DO NOTHING。我应该怎么做?

INSERT INTO story_sites (story_id, site_id)
SELECT story_id, 12
FROM story_sites
WHERE site_id = 70
AND NOT EXISTS
(
    SELECT id
    FROM story_sites
    WHERE site_id = 12
);

最佳答案

你很接近。您只需要将 story_id 考虑在内:

INSERT INTO story_sites (story_id, site_id)
    SELECT ss.story_id, 12
    FROM story_sites ss
    WHERE ss.site_id = 70 AND
          NOT EXISTS (SELECT id
                      FROM story_sites ss2
                      WHERE ss2.site_id = 12 AND ss2.sotry_id = ss.story_id
                     );

总而言之,如果同时发生多个插入,此查询仍有可能出现问题。你真正应该使用的是 on conflict do nothing,这在 documentation 中有解释。用于插入

关于sql - Postgres 9.4——在向表中插入行时如何忽略重复键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53662222/

相关文章:

sql - Oracle:VLOOKUP 等效项

MySQL触发器: Update when reaching a certain datetime

mysql - 在 SQL 中正确使用表之间的多对多关系?

postgresql - POSTGRES 续写任何运算符查询

postgresql - 对 sequelize seeder 的自定义查询

performance - Postgres 8.3 中的位图扫描比索引扫描 Postgres 9.4 快 2 倍?

sql - Excel VBA - 存储过程 (SQL Server)

python - 通过 Binary Copy 将包含 PostGis 字段的数据批量加载到 PostgreSQL

c# - 当无法找到请求的 PostgreSQL 表时,如何捕获异常并使用错误代码?

postgresql - Postgresql 在查询中获取限制的记录总数