Я сконфигурировал базу данных firebird для автоматического инициализации первичного ключа таблицы.Firebird/IBPP: Как получить идентификатор, сгенерированный автоинкрементацией базы данных?
CREATE GENERATOR GEN_CHANNEL_PARAMETER_SET_ID;
SET GENERATOR GEN_CHANNEL_PARAMETER_SET_ID TO 0;
CREATE TRIGGER CHANNEL_PARAMETER_SETS_BI FOR CHANNEL_PARAMETER_SETS
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
if (NEW.CHANNEL_PARAMETER_SET_ID is NULL) then NEW.CHANNEL_PARAMETER_SET_ID = GEN_ID(GEN_CHANNEL_PARAMETER_SET_ID, 1);
END
Теперь в моем C++ программа, использующая ППИР У меня есть следующая проблема:
При установке набора данных в новую строку этой таблицы программы я знаю, все значения в моем C++ Зависит новый первичный ключ, потому что база данных создает его. Как я могу получить этот ключ из базы данных?
Возможно, кто-то еще вставил запись - через мгновение после того, как я вставил ее. Таким образом, получение PK с наивысшим значением может создать ошибку. Как я могу справиться с этим?
Принятие ответ Амир Рахими Farahani, я нашел следующее решение моей проблемы:
Я использую генератор:
CREATE GENERATOR GEN_CHANNEL_PARAMETER_SET_ID;
SET GENERATOR GEN_CHANNEL_PARAMETER_SET_ID TO 0;
и следующий C++/IBPP/SQL кода:
// SQL statement
m_DbStatement->Execute(
"SELECT NEXT VALUE FOR gen_channel_parameter_set_id FROM rdb$database"
);
// Retrieve Data
IBPP::Row ibppRow;
int64_t channelParameterSetId;
m_DbStatement->Fetch(ibppRow);
ibppRow->Get (1, channelParameterSetId);
// SQL statement
m_DbStatement->Prepare(
"INSERT INTO channel_parameter_sets "
"(channel_parameter_set_id, ...) "
"VALUES (?, ...) "
);
// Set variables
m_DbStatement->Set (1, channelParameterSetId);
...
...
// Execute
m_DbStatement->Execute();
m_DbTransaction->CommitRetain();
Это прямое решение. Но я думаю, что есть недостаток, который счетчик увеличивает каждый раз, когда оператор (SELECT NEXT VALUE FOR ...) выполняется, даже если вставка впоследствии терпит неудачу. Или есть способ справиться с этим? –
Триггерный подход «ПЕРЕД ВСТРОЕНИЕМ» имеет тот же эффект, если после этого вставка выходит из строя. –