我试图找出一个可以执行幂等插入的查询,但是当重复插入不包含相同信息时会引发错误。
例如,给定一个现有表:
| 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, email) VALUES
('joseph', 'joseph@somewhere.com'), -- 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类似的问题,但是我无法获得解决方案来引发错误。
答案 0 :(得分:0)
如果您向表中添加另一个唯一约束{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
然后它起作用。您希望将电子邮件的唯一约束显示为错误,但将电子邮件和名称组合使用的唯一约束则无提示地失败。
也许对此有一个更优雅的解决方案,但它已经接近您已经拥有的解决方案。
如果名称相同且电子邮件不同,这不会引发错误,因为名称没有唯一约束。