2017-11-30 4 views
0

Ich versuche, eine Tabelle in der folgenden Art und Weise zu aktualisieren, und eine unique_violation Ausnahme erhalten, diePL/SQL: auf Update-Versuch, Zeile löschen, die unique_violation Ausnahme verursacht

my.db=# UPDATE my_table SET code = REPLACE(code, ‘abd’, ‘abc’); 
ERROR: duplicate key value violates unique constraint "my_table_pkey" 
DETAIL: Key (code, group_id)=(abc, 1) already exists. 

wird erwartet, dass ich weiß, dass ich brauche, um löschen sie die falsche Zeile, anstatt sie zu aktualisieren, wenn es diese Ausnahme verursacht, so etwas wie die folgend ich versuche

DO $$ 
    BEGIN 
     UPDATE my_table SET code = REPLACE(code, ‘abd’, ‘abc’); 
    EXCEPTION 
     WHEN unique_violation THEN 
      DELETE FROM my_table WHERE code = ‘abd’ AND group_id = ?; 
END $$; 

zu schreiben Wie würde ich die Ausnahme nur die Zeile löscht verursacht geworfen werden und sicherstellen, dass mein Updates fortsetzen auf allen anderen Einträgen laufen?

Antwort

1

Fügen Sie es in einen BEGIN..END Block innerhalb eines impliziten Cursors für die Schleife ein.

DO $$ 
    BEGIN 
    for rec IN (select code, group_id FROM my_table) 
    LOOP 
     BEGIN 
     UPDATE my_table SET code = REPLACE(code, 'abd', 'abc') WHERE code=rec.code AND group_id=rec.group_id; 
     EXCEPTION 
     WHEN unique_violation THEN 
      DELETE FROM my_table WHERE code = 'abd' AND group_id = ?; 
     END; 
    END LOOP; 
END $$; 
+0

Das ist großartig, danke! In der delete-Anweisung kann ich jetzt einfach 'group_id = rec.group_id' verwenden. Danke für Ihre Hilfe – Katie

Verwandte Themen