Die Kommentare zu groß werden immer Kommentare zu sein - von einer ganz Marge.
Fehler -346 ist kein Problem mit Gegenwart/Abwesenheit. Die Anweisungen von finderr -346
sagen:
While the database server was processing an UPDATE, it received an unexpected error. Check the accompanying ISAM error code for more detailed information on the cause. Possible causes include hardware errors and locking conflicts.
Sie werden die ISAM-Fehler verfolgen müssen (sqca.sqlerrd [1] in ESQL/C), um weitere Informationen zu erhalten; Es sollte eine Fehlernummer mit einem absoluten Wert zwischen 100 und 199 sein. Dies bedeutet wahrscheinlich, dass es ein Problem in Ihrem Produktionssystem gibt.
Beachten Sie, dass beim Aktualisieren einer nicht vorhandenen Zeile mit einem gesuchten UPDATE einfach null Zeilen aktualisiert werden sollen, die erfolgreich aktualisiert wurden. In einer MODE ANSI-Datenbank würden Sie einen Status von 100 (SQLNOTFOUND) anstelle von 0 (kein Fehler) erhalten. Wenn Sie WHERE CURRENT OF update durchführen und die Zeile nicht mehr vorhanden ist, dann passiert etwas Seltsames - es sollte nicht passieren (weil es bedeutet, dass Sie die Zeile nicht gesperrt haben, als Sie sie ausgewählt haben, sondern jemanden hat es geschafft, die Zeile zu löschen, obwohl sie eigentlich gesperrt sein sollte). Wenn Sie die FOR UPDATE-Klausel nicht verwendet haben, sollte der WHERE CURRENT OF einen spezifischeren Fehler aufweisen.
An diesem Punkt wurde die Frage aktualisiert, um die Fehlerinformationen anzuzeigen.
Curious Nachricht: Ich lief
create table sample
(
serial_number integer not null primary key,
value varchar(30) not null
);
insert into sample values(123, 'one hundred and twenty-three');
update sample set serial_number = 124 where serial_number = 99;
, die einen Status von 0 gibt (und Berichte 0 Zeilen aktualisiert). Ihre Nachricht hat -100
als den ISAM-Fehler; Das ist die Nachricht für 'ISAM-Fehler: Duplizierter Wert für einen Datensatz mit eindeutigem Schlüssel'.
Aber wenn ich versuche:
insert into sample values(99, 'ninety-nine');
update sample set serial_number = 123 where serial_number = 99;
ich Fehler:
SQL -268: Unique constraint (jleffler.u160_350) violated.
ISAM -100: ISAM error: duplicate value for a record with unique key.
Das ist, was ich erwarten würde.Ich bemerke, dass Sie eine Spalte vom Typ SERIAL (oder SERIAL8 oder BIGSERIAL) nicht direkt aktualisieren können: Sie erhalten SQL -232: A SERIAL column (s) may not be updated
(wobei s
der Name der seriellen Spalte war, die ich zu aktualisieren versuchte, um die Nachricht zu generieren - es ist kein schlechter Plural in der Botschaft).
Da die primäre Nachricht für den Fehler -346 angibt, dass ein Problem in der Datenbank auftreten könnte, wäre es sinnvoll, ON-Check (oncheck
) auf dem System auszuführen, um festzustellen, ob diese Tabelle in Ordnung ist. Wenn Sie ON-Check nicht gewohnt sind, müssen Sie die Optionen nachschlagen. Ich würde wahrscheinlich einige allgemeine Überprüfungen durchführen (z. B. oncheck -cr
, um die reservierten Seiten zu überprüfen), bevor ich fortfahre, die Tabelle und die Indizes, in denen das Problem auftritt, zu validieren (oncheck -ci
und oncheck -cd
). Es kann sich lohnen, die Optionen -cR
, -cI
, -cD
zu verwenden, um weitere Informationen zu erhalten.
Fehler -346 ist kein Problem mit Gegenwart/Abwesenheit. Die Anweisungen von 'finderr -346' sagen _Während der Datenbankserver ein UPDATE verarbeitete, erhielt er einen unerwarteten Fehler . Überprüfen Sie den begleitenden ISAM-Fehlercode für weitere detaillierte Informationen zur Ursache. Mögliche Ursachen sind Hardware-Fehler und Sperrkonflikte._ Sie müssen den ISAM-Fehler ('sqca.sqerrd [1]' in ESQL/C) nachverfolgen, um weitere Informationen zu erhalten. Es sollte eine Fehlernummer mit einem absoluten Wert zwischen 100 und 199 sein. Dies bedeutet wahrscheinlich, dass es ein Problem in Ihrem Produktionssystem gibt. Zeige das SQL. –
Beachten Sie, dass beim Aktualisieren einer nicht vorhandenen Zeile mit einem gesuchten UPDATE einfach null Zeilen aktualisiert werden sollten, die erfolgreich aktualisiert wurden. In einer MODE ANSI-Datenbank würden Sie einen Status von 100 (SQLNOTFOUND) anstelle von 0 (kein Fehler) erhalten. Wenn Sie WHERE CURRENT OF update durchführen und die Zeile nicht mehr vorhanden ist, dann passiert etwas Seltsames - es sollte nicht passieren (weil es bedeutet, dass Sie die Zeile nicht gesperrt haben, als Sie sie ausgewählt haben, sondern jemanden hat es geschafft, die Zeile zu löschen, obwohl sie eigentlich gesperrt sein sollte). Wenn Sie die FOR UPDATE-Klausel nicht verwendet haben, sollte der WHERE CURRENT OF einen spezifischen Fehler aufweisen. –
Danke Jonathan. Ich habe den SQL-Fehler auch aktualisiert. Wir sind nicht sicher, ob unsere Informix DB im ANSI MODE erstellt wird oder nicht. –