我正在尝试在有两个约束的表上进行更新插入。一种是a列是唯一的,另一种是b、c、d和e列一起是唯一的。我不想要的是 a、b、c、d 和 e 一起是唯一的,因为这将允许两行在 a 列中具有相同的值。
如果违反第二个约束(唯一的 b、c、d、e),则以下操作将失败:
INSERT INTO my_table (a, b, c, d, e, f, g)
SELECT (a, b, c, d, e, f, g)
FROM my_temp_table temp
ON CONFLICT (a) DO UPDATE SET
a=EXCLUDED.a,
b=EXCLUDED.b,
c=EXCLUDED.c,
d=EXCLUDED.d,
e=EXCLUDED.e,
f=EXCLUDED.f,
g=EXCLUDED.g;
如果违反第一个约束(唯一的 a),则以下操作将失败:
INSERT INTO my_table (a, b, c, d, e, f, g)
SELECT (a, b, c, d, e, f, g)
FROM my_temp_table temp
ON CONFLICT ON CONSTRAINT my_table_unique_together_b_c_d_e DO UPDATE SET
a=EXCLUDED.a,
b=EXCLUDED.b,
c=EXCLUDED.c,
d=EXCLUDED.d,
e=EXCLUDED.e,
f=EXCLUDED.f,
g=EXCLUDED.g;
我怎样才能把这两个结合在一起?我首先尝试定义一个约束,即“a 是唯一的,或者 b、c、d 和 e 一起是唯一的”,但看起来这是不可能的。然后,我尝试了两个带有 WHERE 子句的 INSERT 语句,以确保不会违反另一个约束,但在第三种情况下,一行可能同时违反两个约束。为了处理最后一种情况,我考虑删除其中一个约束并在 INSERT 之后创建它,但是没有更好的方法来做到这一点吗?
我尝试了这个,但根据 PostgreSQL 文档,它只能做任何事情:
INSERT INTO my_table (a, b, c, d, e, f, g)
SELECT (a, b, c, d, e, f, g)
FROM my_temp_table temp
ON CONFLICT DO UPDATE SET
a=EXCLUDED.a,
b=EXCLUDED.b,
c=EXCLUDED.c,
d=EXCLUDED.d,
e=EXCLUDED.e,
f=EXCLUDED.f,
g=EXCLUDED.g;
我在另一个问题中读到,它可能可以在 PostgreSQL 15 中使用 MERGE,但遗憾的是它在 AWS RDS 上尚不可用。我需要找到一种使用 PostgreSQL 14 来做到这一点的方法。