SELECT LAST_INSERT_ID()返回零

时间:2015-11-14 11:13:49

标签: mysql qt

我有以下Qt / C ++方法:

quint64 UeBillModel::ueGetNextPickupIndex()
{
    quint64 pickupIndex=0;

    if(!this->ueDatabase().isOpen())
    {
        this->ueConnectToDatabase();
    }   // if

    this->setQuery(UePosDatabase::UeSqlQueries::UeInsertNewBill::SQL_QUERY_CALC_NEXT_PICKUP_NUMBER,
                   this->ueDatabase());

    if(this->lastError().isValid())
    {
        qDebug() << this->lastError();

        pickupIndex=-1;
    }
    else
    {
        this->setQuery(UePosDatabase::UeSqlQueries::UeInsertNewBill::SQL_QUERY_GET_NEXT_PICKUP_NUMBER,
                       this->ueDatabase());

        if(this->lastError().isValid())
        {
            qDebug() << this->lastError();

            pickupIndex=-1;
        }
        else
        {
            pickupIndex=this->record(0).value(0).toUInt();
        }   // if
    }   // if

    return pickupIndex;
}   // ueGetNextPickupIndex

执行此方法后,它将返回0。如您所见,它执行了两个查询:

    static const QString SQL_QUERY_CALC_NEXT_PICKUP_NUMBER="UPDATE "+UePosDatabase::UeTableNames::TABLE_PICKUP_NUMBER+ " SET ID = LAST_INSERT_ID(ID+1)";
    static const QString SQL_QUERY_GET_NEXT_PICKUP_NUMBER="SELECT LAST_INSERT_ID()";

使用第一个,我更新表PICKUP_NUMBER中的字段,第二个我想获得最后一个插入的id。如果我直接在mysql服务器中执行这两个语句,我得到正确的值。为什么然后方法返回0

1 个答案:

答案 0 :(得分:1)

首先,MYSQL中的LAST_INSERT_ID()函数具有连接范围。这意味着,只要关闭以前的连接,就会失去对该值的访问权限。这就是为什么,如果你打开一个全新的连接,在你执行插入之前就没有价值。

其次,存储此值或尝试从中计算任何内容并不是一个好主意,除非您需要将其用作另一个表中的外键。

在您插入和使用最后一个ID的时间之间,可能有另一个用户在您的表中插入了另一条记录,使您的存储ID多余,并使您面临数字冲突的风险。

第三,QtSqlQuery类具有函数getLastInsertId()用于此目的(只要数据库连接保持打开状态),并且可以用于支持此功能的任何数据库,通过检查确定返回值QSqlDriver::hasFeature(QSqlDriver::lastInsertId)