我正在更新一个有4列作为主键的表。
|Col1|Col2|Col3|Col4|val|
| 1| 2| 3| 4|234|
Col 1-4制作主键
我需要在某些行中更新Col1。但是有些行已经具有我想要更新的值。因此,当我运行查询时,它给出:
ERROR: duplicate key value violates unique constraint "datavalue_pkey"
DETAIL: Key (Col1, Col2, Col3, Col4)=(609, 76911, 164, 1) already exists.
如何忽略已存在的案例以便更新查询完全运行?
更新查询:
update datavalue dv set Col1 = 6009
where concat( dv.Col1 ,'-',dv.Col2,'-',Col3,'-',dv.Col4)
in (
Select concatenated id ... from same table
)
由于
POSTGRES - 9.5.12
答案 0 :(得分:1)
根据您的应用程序,我建议编写一个函数,但我猜您正在寻找的是这样的(快速和肮脏):
测试表和数据集:
CREATE TEMP TABLE t (id INT UNIQUE, des TEXT);
INSERT INTO t VALUES (1,'foo'),(2,'bar');
更新忽略冲突。
DO $$
DECLARE r RECORD;
BEGIN
FOR r IN SELECT * FROM t LOOP
BEGIN
UPDATE t SET id = 2 WHERE des = 'foo' AND id = r.id;
UPDATE t SET des = 'bar2' WHERE id = 2 AND id = r.id;
EXCEPTION WHEN unique_violation THEN
RAISE NOTICE 'Oups .. there was a conflict on % - %',r.id,r.des;
END;
END LOOP;
END$$;
答案 1 :(得分:0)
如果我正确理解了您的示例,则应该能够使用子查询简单地排除要设置的具有Col1值的行。
Run a loop i through B :
if B[i][1] != -1 :
run a loop j though A from j=B[i][1]+1 :
print if A[j] > 2*i and A[j] is odd