2015-11-14 71 views
0

我具有以下的Qt/C++方法:SELECT LAST_INSERT_ID()返回零

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

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

其次,它不是一个好主意,可以存储此值,也可以尝试计算任何值,除非您需要将其用作另一个表中的外键。

在插入时间和使用最后一个ID之间的时间内,可能有另一个用户在您的表格中插入了另一条记录,导致存储的ID冗余,并使您处于数字冲突的风险中。

第三,QtSqlQuery类具有恰好为此目的一个函数getLastInsertId()(只要数据库连接保持打开),并且可用于支持该功能的任何数据库,通过检查的QSqlDriver::hasFeature(QSqlDriver::lastInsertId)

+0

返回值来确定有用的职位,但我应该如何以“正确”的方式解决这种情况? – KernelPanic

+0

这完全取决于你为什么要将价值存储在第一位。正如我在文章中所说的,只有在您需要外键时才应该这样做。 – RobbieE