postgres:更新行但忽略更新时违反唯一约束的行

时间:2018-03-16 06:22:04

标签: postgresql sql-update

我正在更新一个有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

2 个答案:

答案 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