等幂插入,如果值是新的,则引发错误

我试图找出一个可以执行幂等插入的查询,但是当重复插入不包含相同信息时会引发错误。

例如,给定一个现有表:

| name   | email                |
|--------|----------------------|
| joseph | joseph@somewhere.com |
| frank  | frank@somewhere.com  |

email有一个UNIQUE约束的地方。 插入('joseph,'joseph@somewhere.com')应该什么都不做(我已经实现了), 但是插入('francis','frank@somewhere.com')会因唯一约束违规而引起错误,因为“名称”值是新的。

是否可以在单个查询中执行此操作?

完整示例:

CREATE TABLE "users" (
  id serial PRIMARY KEY,created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),email VARCHAR UNIQUE,name VARCHAR
);

INSERT INTO "users" (name,email) VALUES
  ('joseph','joseph@somewhere.com'),('frank','frank@somewhere.com');

INSERT INTO "users" (name,-- Same values,should do nothing
  ('frankie','frank@somewhere.com')  -- New "name" value,should raise error
  ON CONFLICT (email)
    DO NOTHING

此SQL将成功运行-here is a fiddle-但我希望它从第二组值中引发错误。

这是与this one类似的问题,但是我无法获得解决方案来引发错误。

baiyanhua_2005 回答:等幂插入,如果值是新的,则引发错误

如果您向表中添加另一个唯一约束{unique(email,name)},使其看起来像这样:

CREATE TABLE "users" (
  id serial PRIMARY KEY,created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),email VARCHAR UNIQUE,name VARCHAR,unique(email,name)
);

然后将查询更改为:

INSERT INTO "users" (name,email) VALUES
  ('joseph','joseph@somewhere.com'),-- Same values,should do nothing
  ('frankie','frank@somewhere.com')  -- New "name" value,should raise error
  ON CONFLICT (email,name)
    DO NOTHING

然后它起作用。您希望将电子邮件的唯一约束显示为错误,但将电子邮件和名称组合使用的唯一约束则无提示地失败。

也许对此有一个更优雅的解决方案,但它已经接近您已经拥有的解决方案。

如果名称相同且电子邮件不同,这不会引发错误,因为名称没有唯一约束。

本文链接:https://www.f2er.com/3147501.html

大家都在问