sql >> Databasteknik >  >> RDS >> PostgreSQL

Är det möjligt att fånga ett brott mot främmande nyckel i postgres

Om du bara infogar en enstaka rad åt gången kan du skapa en räddningspunkt före infogningen och återställning till den när insättningen misslyckas (eller släpp den när insättningen lyckas).

För Postgres 9.5 eller senare kan du använda INSERT ... ON CONFLICT DO NOTHING som gör vad den säger. Du kan också skriv ON CONFLICT DO UPDATE SET column = value... , som automatiskt konverterar din infogning till en uppdatering av raden du är i konflikt med (denna funktion kallas ibland "upsert").

Detta fungerar inte eftersom OP har att göra med en främmande nyckel begränsning snarare än en unik begränsning. I så fall kan du enklast använda sparpunktsmetoden jag beskrev tidigare, men för flera rader kan det visa sig tråkigt. Om du behöver infoga flera rader samtidigt bör det vara rimligt att dela upp dem i flera infogningssatser, förutsatt du arbetar inte i autocommit-läge , alla infogningar sker i en transaktion och du infogar inte ett särskilt stort antal rader.

Ibland behöver du verkligen flera inlägg i ett enda uttalande, eftersom omkostnaden tur och retur för att prata med din databas plus kostnaden för att ha sparpunkter på varje infogning helt enkelt är för hög. I det här fallet finns det ett antal ofullkomliga tillvägagångssätt. Förmodligen det minst dåliga är att bygga en kapslad fråga som väljer din data och sammanfogar den mot den andra tabellen, ungefär så här:

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. Fel vid försök att uppdatera tidtabellen vid vårstart

  2. Upptäck om raden har uppdaterats eller infogats

  3. Hittade en okänd relationsdiagramsymbol i Oracle SQL Developer

  4. Hur kan jag hämta instans av senast tillagda objekt