c – Firebird / IBPP:如何检索数据库自动增量生成的ID?
发布时间:2020-12-16 09:57:26 所属栏目:百科 来源:网络整理
导读:我将firebird数据库配置为自动增加表的主键. 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_SETSACTIVE BEFORE INSERT POSITION 0ASBEG
我将firebird数据库配置为自动增加表的主键.
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 现在,在我使用IBPP的C程序中,我遇到以下问题: 将数据集插入此表的新行时,我知道我的C程序中的所有值都会释放新的主键,因为数据库会创建它.如何从数据库中检索此密钥? 也许其他人也插入了一个条目 – 在我插入一个之后的那一刻.因此,检索具有最高值的PK可能会产生错误.我怎么处理这个? 采用Amir Rahimi 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 (); 解决方法
在插入新记录之前,可以生成并使用新的id:
SELECT NEXT VALUE FOR GEN_CHANNEL_PARAMETER_SET_ID FROM rdb$database 您现在知道新主键的值. 更新: // SQL statement m_DbStatement->Prepare( "INSERT INTO channel_parameter_sets " "(...) VALUES (...) RETURNING channel_parameter_set_id" ); // Execute m_DbStatement->Execute (); m_DbTransaction->CommitRetain (); // Get the generated id m_DbStatement->Get (1,channelParameterSetId); ... (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |