sql >> Databáze >  >> RDS >> PostgreSQL

Je možné zachytit porušení cizího klíče v postgresu

Pokud vkládáte pouze jeden řádek najednou, můžete vytvořit bod uložení před vložením a vrácení zpět na něj, když vložení selže (nebo jej uvolněte když se vložení podaří).

Pro Postgres 9.5 nebo novější můžete použít INSERT ... ON CONFLICT DO NOTHING který dělá, co říká. Můžete také napište ON CONFLICT DO UPDATE SET column = value... , který automaticky převede vaši přílohu na aktualizaci řádku, se kterým jste v konfliktu (tato funkce se někdy nazývá „upsert“).

To nefunguje, protože OP pracuje s cizím klíčem spíše omezení než jedinečný omezení. V takovém případě můžete nejsnáze použít metodu bodu uložení, kterou jsem popsal dříve, ale pro více řádků to může být zdlouhavé. Pokud potřebujete vložit více řádků najednou, mělo by být přiměřeně výkonné je rozdělit do více příkazů vložení, za předpokladu nepracujete v režimu automatického potvrzení , všechna vložení proběhnou v jedné transakci a nevkládáte příliš velký počet řádků.

Někdy opravdu potřebujete více vložek v jednom příkazu, protože režie zpětného hovoru s vaší databází plus náklady na uložení bodů na každém vložení jsou prostě příliš vysoké. V tomto případě existuje řada nedokonalých přístupů. Pravděpodobně nejméně špatný je vytvořit vnořený dotaz, který vybere vaše data a spojí je s druhou tabulkou, něco takového:

INSERT INTO table_A (column_A, column_B, column_C)
SELECT A_rows.*
FROM VALUES (...) AS A_rows(column_A, column_B, column_C)
JOIN table_B ON A_rows.column_B = table_B.column_B;



  1. Konstrukce SQL dotazu - rozdělení dat ve sloupci do dvou sloupců

  2. Maven Fatal alert:protocol_version

  3. Dotaz GTFS pro zobrazení všech časů odjezdů a příjezdů mezi dvěma názvy zastávek

  4. Existuje nějaký způsob, jak vyřešit známý problém ve Spring Boot při připojení k databázi MySQL se středoevropským časovým pásmem?