我有以下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
?
答案 0 :(得分:1)
首先,MYSQL中的LAST_INSERT_ID()
函数具有连接范围。这意味着,只要关闭以前的连接,就会失去对该值的访问权限。这就是为什么,如果你打开一个全新的连接,在你执行插入之前就没有价值。
其次,存储此值或尝试从中计算任何内容并不是一个好主意,除非您需要将其用作另一个表中的外键。
在您插入和使用最后一个ID的时间之间,可能有另一个用户在您的表中插入了另一条记录,使您的存储ID多余,并使您面临数字冲突的风险。
第三,QtSqlQuery
类具有函数getLastInsertId()
用于此目的(只要数据库连接保持打开状态),并且可以用于支持此功能的任何数据库,通过检查确定返回值QSqlDriver::hasFeature(QSqlDriver::lastInsertId)