Команда для получения идентификатора вновь вставленной записи в Interbase 2007 - PullRequest
0 голосов
/ 07 октября 2010

В Interbase (я использую 2007, я не знаю, имеет ли это значение) есть ли команда для получения идентификатора вновь вставленной записи, аналогично SCOPE_IDENTITY () в SQL Server?

1 Ответ

2 голосов
/ 07 октября 2010

Нет, 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 запись с использованием альтернативного ключа и чтение сгенерированного идентификатора таким образом.

...