加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

您现在知道新主键的值.

更新:
IBPP也支持RETURNING:

// 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);
...

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读