Нет, InterBase на самом деле не имеет функции идентификации.
Вместо этого в InterBase есть функция генератора.Генераторы похожи на идентичность, но они логически отделены от столбца первичного ключа.Другими словами, генератор даст вам гарантированное уникальное значение, но что вы будете делать с этим значением, зависит от вас.
Вы можете использовать это значение в качестве значений первичного ключа для одной таблицы или длянесколько столов.Но на самом деле присвоение значения первичного ключа - это то, что вы должны сделать сами.
Помимо отсутствия функции, подобной SCOPE_IDENTITY
, InterBase не имеет какой-либо функции для возврата значений из оператора INSERT
.Таким образом, вы не только не можете получить сгенерированное значение первичного ключа обратно из оператора INSERT
, вы также не можете получить другие значения, например значения, установленные триггером.
Временные решения
OneВозможный обходной путь для этого - заранее сгенерировать значение первичного ключа.Таким образом, вы можете сделать что-то вроде следующего (я собираюсь использовать синтаксис хранимых процедур InterBase для этого примера, так как я не знаю, какой язык программирования вы используете, но вы можете сделать то же самое на любом языке программирования):
DECLARE VARIABLE ID INTEGER;
BEGIN
ID = SELECT GEN_ID(MY_GENERATOR, 1) FROM RDB$DATABASE;
INSERT INTO MY_TABLE (ID, DESCRIPTION) VALUES (:ID, "Foo");
RDB$DATABASE
- это системная таблица, в которой есть только одна запись.Зная значение ID
, вы можете вернуть его из процедуры.
Второй обходной путь - SELECT
запись с использованием альтернативного ключа и чтение сгенерированного идентификатора таким образом.