вставка строки без значений для столбцов первичного ключа завершается неудачно - PullRequest
0 голосов
/ 18 февраля 2019

Для следующей таблицы: enter image description here

Я запускаю следующую хранимую процедуру:

enter image description here

Я перенаправлен на вкладку «Результаты» и ничего не вижу.Затем, если я нажму на иконку «обновить» (под вкладкой «Результаты»), то откроется диалоговое окно:

SQLCODE = -625 ошибка проверки для идентификатора столбца, значение «* ноль *»

enter image description here

И, конечно, ничего не добавляется ...

Насколько я понимаю, firebird ожидает некоторое значение для RC_ID (которыймой PK и должен автоматически увеличиваться).Если я даю значение также для RC_ID, он работает хорошо.

Итак, что я должен сделать, чтобы сделать четкую «вставку» без этих ошибок?

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Проблема в том, что вы не устанавливаете значение для первичного ключа.Вопреки вашему ожиданию, первичные ключи не увеличиваются автоматически.Это касается любой базы данных, о которой я знаю.Вам всегда нужно пометить его как идентификатор, автоинкремент или сгенерированный, или как-то еще, чтобы получить такое поведение, хотя некоторые инструменты (составители таблиц) могут уже применить это для вас по умолчанию.

Если вы используете Firebird 3, вы можете определить свой столбец как GENERATED BY DEFAULT AS IDENTITY (см. Тип столбца идентификации в примечаниях к выпуску Firebird 3).Для более ранних версий Firebird лучше всего определить последовательность (также известную как генератор) с триггером перед вставкой, который заполняет столбец первичного ключа.

Для получения дополнительной информации о том, как определить столбец идентификаторов (или определитьтриггер), см. мой ответ на этот вопрос: Самый простой способ создать поле автоинкремента в базе данных Firebird .

0 голосов
/ 18 февраля 2019

В Firebird автоинкремент не работал, как в MySQL.Таким образом, отправка значения для RC_ID была обязательной ...

Я нашел несколько рабочих примеров, основанных на идее:

  • создать генератор
  • назначить его столбцу(PK)
  • вызовите GEN_ID с этим генератором следующим образом:

:

   begin
      insert into RESERVATIONCATEGORY (RC_ID, RC_NAAM)
      values (
      GEN_ID(GEN_RESERVATIONCATEGORY _ID,1), 'selam'
      );
      suspend;
    end
...