Обновление или вставка Firebird сгенерированным ключом - PullRequest
0 голосов
/ 05 декабря 2018

Firebird 2.5 под Delphi 10.2 с FireDAC: у меня есть таблица, содержащая данные определений для объектов-обработчиков событий, и TObjectList тех объектов, которые загружаются и сохраняются из таблицы - эта таблица никогда не становится очень большой, может быть, максимум30-40 рядов, часто только горстка.Каждая строка таблицы имеет PK, сгенерированный триггером после вставки.Мне нужно иметь возможность обновлять объекты обратно в соответствующие строки таблицы и вставлять любые новые записи и , чтобы получить сгенерированное значение PK после вставки, чтобы сохранить соответствие идентификатора объекта.

Предложение UPDATE OR INSERT, поддерживаемое Firebird, похоже, не подходит для случаев, когда PK генерируется триггером после вставки, но, возможно, я что-то упускаю.

Так что есть простой способ сделатьэтот тип конструкции?А учитывая небольшой размер таблицы, будет ли более эффективным (если не совсем кошерным) просто сжать таблицу и вставить все новые записи?

1 Ответ

0 голосов
/ 06 декабря 2018

Оператор UPDATE OR INSERT поддерживает предложение RETURNING, которое позволяет вам возвращать сгенерированный идентификатор.

Однако основная проблема заключается в том, что вы говорите ", где PKгенерируется триггером после вставки ".Это невозможно, или - по крайней мере, - если вы делаете это прямо сейчас, вы делаете это неправильно, и, скорее всего, вы используете обходной путь, такой как оператор update для таблицы.

Правильный способ генерации идентификатора - использование триггера «перед вставкой», когда значение устанавливается в контексте NEW (например, NEW.id = <generated value>).Триггер «после вставки» не может изменить контекст NEW и поэтому не может корректно обновлять значения столбцов.Обновление значения в контексте NEW в триггере «перед вставкой» также позволяет возвращать его с помощью предложения RETURNING.

См. Также «Старые и новые переменные контекста» в справочнике по языку Firebird:

Во всех AFTER триггерных кодах переменные NEW доступны только для чтения

Вы также можете прочитатьCREATE TRIGGER документация, которая также включает примеры того, как генерировать идентификаторы.Другой пример см. Как создать столбец автоинкремента? .

...