如果Postgres中不存在记录,则插入值

Mat*_*ork 11 sql postgresql

我想让这个工作,但Postgres不喜欢WHERE在这种类型的插入中使用该子句.

  INSERT INTO keys(name, value) VALUES
    ('blah', 'true')
  WHERE NOT EXISTS (
    SELECT 1 FROM keys WHERE name='blah'
  );
Run Code Online (Sandbox Code Playgroud)

Voi*_*ain 33

在Postgres中,有一种非常好的方法:

INSERT INTO keys(name, value) 
    SELECT 'blah', 'true'
WHERE NOT EXISTS (
    SELECT 1 FROM keys WHERE name='blah'
);
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.-

  • 我不明白为什么突然我们在这里不使用 VALUES ......我已经查看了很多地方以找到人们使用 VALUES 的地方,但似乎使用了“SELECT”。超级纠结? (4认同)
  • @PascalVKooten 缩进可能会让你失望:`WHERE` 子句属于语句的`SELECT` 部分,而不是整个`INSERT`。 (3认同)

MK *_*ung 14

在Postgresql 9.5中,您现在可以使用 on conflict do nothing

insert into KEYS (name, value) values (
'blah', 'true') on conflict (name) do nothing;
Run Code Online (Sandbox Code Playgroud)

  • @Konrad 据我所知,`on conflict` 子句仅适用于唯一键和约束。对于“普通列”,您应该使用“不存在的地方”。来自 postgres 上的 INSERT 文档:`通过选择仲裁索引指定哪些冲突 ON CONFLICT 采取替代操作。要么执行唯一索引推断,要么显式命名约束` (10认同)