SQL/DB2 SQLSTATE=23505 Fehler beim ausführen einer UPDATE-Anweisung
Ich bin immer ein SQLSTATE=23505 Fehlermeldung, wenn ich führen Sie die folgenden DB2-Anweisung:
update SEOURLKEYWORD
set URLKEYWORD = REPLACE(URLKEYWORD, '/', '-')
where STOREENT_ID = 10701
and URLKEYWORD like '%/%';
Nachdem eine schnelle Suche, ein SQL-Status 23505 Fehler ist wie folgt definiert:
EINEM EINGEFÜGTEN ODER AKTUALISIERTEN WERT IST UNGÜLTIG, DA DER INDEX IN DER INDEX-RAUM SCHRÄNKT DIE SPALTEN DER TABELLE, SO DASS KEINE ZWEI ZEILEN ENTHALTEN KANN, DIE DOPPELTE WERTE IN DIESEN SPALTEN ENTFERNEN DER VORHANDENEN ZEILE IST X
Den vollständigen Fehler, die ich sehe ist:
Den vollständigen Fehler, die ich sehe ist:
DB2-Datenbank-Fehler: [23505] [IBM][DB2/LINUXX8664] SQL0803N Einen oder mehrere Werte in der INSERT-Anweisung UPDATE-Anweisung, oder die foreign key-update verursacht durch eine DELETE-Anweisung sind nicht gültig, weil die primary key -, unique-Einschränkung oder einen eindeutigen index gekennzeichnet durch "2" schränkt die Tabelle "WSCOMUSR.SEOURLKEYWORD" aus, dass doppelte Werte für die index-Taste. SQLSTATE=23505
1 0
Ich bin mir nicht sicher, was der "index gekennzeichnet durch "2" bedeutet, aber es könnte sein, signifikant.
Den Eigenschaften der Spalten für die SEOURLKEYWORD Tabelle sind wie folgt:
Basiert auf meinem Verständnis von diesen Informationen, die einzige Spalte, die gezwungen ist, einzigartig zu sein, ist SEOURLKEYWORD_ID, die primary key-Spalte. Dies macht es klingen wie die update-Anweisung, die ich versuche zu führen versucht, eine Zeile einzufügen, die einen SEOURLKEYWORD_ID, dass in der Tabelle bereits existiert.
Wenn ich führen Sie eine select * - Anweisung für die Zeilen, ich bin versucht, zu aktualisieren, hier ist was ich bekomme:
select * from SEOURLKEYWORD
where storeent_id = 10701
and lower(URLKEYWORD) like '%/%';
Ich verstehe nicht, wie die Ausführung der UPDATE-Anweisung führt zu einem Fehler hier. Es sind nur 4 Zeilen dieser Erklärung sollte auch an zu suchen, und ich bin nicht, aktualisieren Sie manuell den primären Schlüssel überhaupt. Es scheint, wie es ist Wiedereinsetzen eine doppelte Zeile mit der Spalte "aktualisiert" Wert vor dem löschen der vorhandenen Zeile.
Warum sehe ich diese Fehlermeldung, wenn ich versuche zu aktualisieren, die URLKEYWORD Spalte dieser vier Zeilen? Wie kann ich dieses Problem beheben?
WICHTIG: Wie ich schon schrieb, diese Frage habe ich verengt das problem auf die Letzte der vier Zeilen in der Tabelle oben, SEOURLKEYWORD_ID = 3074457345616973668. Kann ich aktualisieren die anderen drei Zeilen ganz gut, aber die 4. Zeile den Fehler verursacht, ich habe keine Ahnung, warum. Wenn ich ein select * from SEOURLKEYWORD wo SEOURLKEYWORD_ID = 3074457345616973668;, ich sehe nur die 1. Zeile.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist zu lang für einen Kommentar.
Der Fehler ist ziemlich klar. Sie haben einen eindeutigen index/constraint in der Tabelle. Sagen wir, du hast zwei Zeilen wie diese:
Wann wird die erste version wird ersetzt durch
'A-B'
würde, wäre das Ergebnis gegen eine unique-Einschränkung auf(STOREENT_ID, URLKEYWORD)
oder(URLKEYWORD)
(bitte beachten Sie, dass die anderen Spalten könnte eventuell aufgenommen werden in die unique-Einschränkung/index ebenso).Könnte man diese Situationen zu vermeiden, indem nicht zu aktualisieren. Ich weiß nicht, was Spalten, die unique-Einschränkung auf, aber sagen wir mal nur auf
URLKEYWORD
. Dann:Hinweis: die
replace()
ist erforderlich für beide Spalten, da Sie möglicherweise:Diese nur Konflikt nach dem Austausch in beide Werte.
unique constraint or unique index identified by "1"
, aber die Fehlermeldung sagt es ja auch der eine identifiziert (das heißt, die ID) "2".Zur Ergänzung der Antwort von @GordonLinoff, hier ist eine Abfrage, die verwendet werden können, finden Sie eine Tabelle für unique-Einschränkungen, mit Ihren IDs, und die Spalten, die in Ihnen enthalten sind: