Unterdrücken "doppelter Schlüsselwert verletzt unique-constraint" - Fehler
Ich bin die Entwicklung einer Rails 3 app, nutzt Postgres als Datenbank. Ich habe die Tabelle unten gezeigt:
Table "public.test"
Column | Type | Modifiers
---------------+---------+-----------
id | integer | not null
some_other_id | integer |
Indexes:
"test_pkey" PRIMARY KEY, btree (id)
"some_other_id_key" UNIQUE CONSTRAINT, btree (some_other_id)
Diese hat zwei Spalten:
- - id, der Primärschlüssel (automatisch erstellt durch Schienen)
- some_other_id, die die Schlüssel enthält, erzeugt durch ein anderes system. Diese id muss eindeutig sein, also ich habe ein unique key-Einschränkung für die Tabelle.
Nun, wenn ich versuche, einfügen einer Zeile mit einem doppelten some_other_id
scheitert es (gute) und ich bekomme die folgende Ausgabe, die in meinem Postgres-logs:
ERROR: duplicate key value violates unique constraint "some_other_id_key"
Das problem ist, dass es völlig Hauptschnur für meine app zu versuchen, und fügen Sie die gleichen ID zweimal, und meine logs sind als Spam-mit diesem "FEHLER" - Meldung, die verursacht verschiedene Probleme: - Dateien nehmen viel Speicherplatz auf der Festplatte, die Diagnostik verloren gehen in dem Lärm, Postgres hat, wegwerfen, diags, um die Protokolldateien in Größe, Grenzen, etc.
Weiß jemand, wie kann ich entweder:
- Unterdrücken das Protokoll, entweder durch Unterdrückung, alle Protokolle über diesen Schlüssel, oder vielleicht durch die Angabe etwas über die Transaktion, die versucht, die
INSERT
. - Einige andere Postgres-Funktion, um vor Ort das doppelte Schlüssel und nicht versuchen, die
INSERT
. Ich habe gehört, Regeln und Trigger, aber ich kann nicht kommen, entweder um zu arbeiten (obwohl ich bin kein Postgres-Experte).
Beachten Sie, dass jede Lösung muss die Arbeit mit den Schienen, die Ihre Einsätze wie dieser:
INSERT INTO test (some_other_id) VALUES (123) RETURNING id;
- "Das problem ist, dass es völlig Hauptschnur für meine app, um zu versuchen und ad der gleichen ID zweimal," Das scheint mir seltsam. Warum sollte die app versuchen, um doppelte Werte einfügen, und warum Sie denken, es ist normal?
- BTW Ihr einfügen
INSERT INTO test (some_other_id) VALUES (123) RETURNING id;
nicht geben Sie einen Wert für id (die ist NICHT NULL), so ist es sollte auch gegen die NICHT-NULL-Beschränkung für die id. Hat Sie geben uns die wahre Tabelle-definition? ist id eine Seriennummer, durch Zufall?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zur Vermeidung des duplicate-key-Fehler zu beginnen:
Ich bin vorausgesetzt, id ist ein serielle Spalte, erhält Ihren Wert automatisch.
Dies ist Gegenstand einer sehr kleine race condition (in dem Zeitfenster zwischen der
SELECT
und dieINSERT
). Aber das Schlimmste was passieren kann ist, dass Sie eine duplicate-key-Fehler, nachdem alle, und das wird kaum jemals auftreten, und sollte nicht ein problem in Ihrem Fall.Können Sie immer verwenden Sie raw-SQL, wenn Ihr Rahmen schränkt Ihre Optionen für die Verwendung der richtigen syntax.
Oder Sie können eine UDF (user defined function), die für den Zweck:
Nennen:
Oder, um Standard zu einem bereits vorhandenen
id
:Wieder, dass die Blätter eine minimale chance für eine race condition. Können Sie ausschließen, dass auf Kosten der langsameren performance:
id
wenn die race-Bedingung schlägt sich mit der plpgsql-Funktion.Können Sie deaktivieren Sie die Protokollierung von Fehlermeldungen, die für die session (oder Global eigentlich), aber es erfordert superuser-Privilegien:
Mit:
nur schwerwiegende Fehler werden protokolliert, bis die session (=Verbindung) ist endete oder Sie eine neue
set
Anweisung zum zurücksetzen des Wertes.Aber nur als superuser erlaubt ist, dies zu ändern, ist es wahrscheinlich nicht eine gute Lösung wäre es erforderlich, Ihre Anwendung Benutzer haben das Privileg, das ist ein großes security-problem.
postgresql.conf
, aber die Einstellung gibt es wahrscheinlich eine schlechte Idee, da es sonst Maske wichtige Nachrichten über die Probleme bei der Konfiguration, etc.ALTER USER my_rails_user SET log_min_messages = fatal;
möglicherweise weniger drastische, aber noch Masken wichtigen Nachrichten. Besser, fixieren Sie Ihre app einfügen Duplikate.Wenn Sie nur wollen, zu unterdrücken, diejenigen, die Fehler während der Arbeit in
psql
, die Sie tun können,die letzten für den rest der Sitzung.