Комментарии становятся слишком большими, чтобы быть комментарии - на довольно края.
Ошибка -346 не является проблемой при наличии/отсутствии. Инструкции от finderr -346
говорят:
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.
Вам нужно будет отслеживать ошибки ISAM (sqca.sqlerrd [1] в ESQL/C), чтобы получить более подробную информацию; это должен быть номер ошибки с абсолютным значением от 100 до 199. Это, вероятно, означает, что в вашей производственной системе есть какая-то проблема.
Обратите внимание, что обновление несуществующей строки с запрошенным UPDATE должно просто сообщать о нулевых строках, обновленных успешно. В базе данных MODE ANSI вы получите статус 100 (SQLNOTFOUND) вместо 0 (без ошибок). Если вы делаете обновление WHERE CURRENT OF, и строка не пропала, то происходит что-то странное: этого не должно быть (потому что это означает, что вы не получили блокировку строки, когда вы ее выбрали, но кто-то удалось удалить строку, даже если вы ее заблокировали). Если вы не использовали предложение FOR UPDATE, тогда WHERE CURRENT OF должен иметь более конкретную ошибку.
На этом этапе вопрос был обновлен, чтобы отобразить информацию об ошибке.
Любопытное сообщение: Я побежал
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;
, который дает статус 0 (и отчеты 0 строк обновленному). Ваше сообщение имеет -100
как ошибку ISAM; это сообщение для «Ошибка ISAM: дублирующее значение для записи с уникальным ключом».
Но когда я пытаюсь:
insert into sample values(99, 'ninety-nine');
update sample set serial_number = 123 where serial_number = 99;
Я получаю сообщение об ошибке:
SQL -268: Unique constraint (jleffler.u160_350) violated.
ISAM -100: ISAM error: duplicate value for a record with unique key.
Вот о чем я ожидал.Я отмечаю, что вы не можете напрямую обновлять столбец типа SERIAL (или SERIAL8 или BIGSERIAL): вы получаете SQL -232: A SERIAL column (s) may not be updated
(где s
было именем последовательного столбца, который я пытался обновить, чтобы сгенерировать сообщение - это не плохое число в сообщение).
Поскольку первичное сообщение об ошибке -346 указывает на то, что в базе данных может быть проблема, было бы целесообразно запустить в системе ON-Check (oncheck
), чтобы убедиться, что эта таблица в порядке. Если у вас нет привычки запускать ON-Check, вам нужно будет найти варианты. Я, вероятно, проведу некоторые общие проверки (например, oncheck -cr
, чтобы проверить зарезервированные страницы), прежде чем продолжать проверять таблицу и индексы, в которых возникает проблема (oncheck -ci
и oncheck -cd
). Для получения дополнительной информации можно использовать -cR
, -cI
, -cD
.
Ошибка -346 не является проблемой при наличии/отсутствии. Инструкции от 'finderr -346' say _ Пока сервер базы данных обрабатывал UPDATE, он получил непредвиденную ошибку . Проверьте сопроводительный код ошибки ISAM для получения дополнительной информации о причине . Возможные причины включают аппаратное обеспечение ошибки и блокировку конфликтов. Для получения дополнительной информации вам необходимо отслеживать ошибку ISAM ('sqca.sqlerrd [1]' в ESQL/C); это должен быть номер ошибки с абсолютным значением от 100 до 199. Это, вероятно, означает, что в вашей производственной системе есть какая-то проблема. Показать SQL. –
Обратите внимание, что обновление несуществующей строки с запрошенным UPDATE должно просто сообщать об обновлении нулевых строк. В базе данных MODE ANSI вы получите статус 100 (SQLNOTFOUND) вместо 0 (без ошибок). Если вы делаете обновление WHERE CURRENT OF, и строка не пропала, то происходит что-то странное: этого не должно быть (потому что это означает, что вы не получили блокировку строки, когда вы ее выбрали, но кто-то удалось удалить строку, даже если вы ее заблокировали). Если вы не использовали предложение FOR UPDATE, то WHERE CURRENT OF должен иметь определенную ошибку. –
Спасибо, Джонатан. Я также обновил ошибку SQL. Мы не уверены, создана ли наша Informix DB в ANSI MODE или нет. –