如何在使用QSqlTableModel :: insertRecord插入行时检索生成的主键

时间:2013-04-25 13:17:16

标签: sql qt postgresql primary-key qsqltablemodel

这个问题适用于带有Postgres的Windows上的Qt 4.7.3。

我正在尝试通过QSqlTableModel将一行插入到一个非常大的表中,因为这(希望)通过使用QSqlTableModel::setTable来省去输入字段名称的麻烦。我向模型询问QSqlRecord row(QSqlTableModel::record);的记录对象,并通过QSqlRecord::setValue填充数据。这是保持行的代码:

const bool insertOk = tableModel.insertRecord(-1, row);

if (!insertOk || !tableModel.submitAll()) {
  return -1;
}

QSqlError err = tableModel.lastError();
if (err.type() != QSqlError::NoError) {
  std::cerr << "errormsg " << std::endl;
  return -1;
}

const int primaryKey = tableModel.query().lastInsertId().toInt();

以上是我尝试过的内容,但tableModel.query()的内容是一个巨大的选择,没有RETURNING个关键字。 lastInsertId()会返回无效的QVariant。有没有可能让Qt提供生成的主键,而不需要额外的 - 复杂 - 往返数据库。我宁愿不锁定表格以确保最后一个实际上是我创建的那个,如果我可以避免它。

请指教。

1 个答案:

答案 0 :(得分:0)

使用LASTVAL()的附加查询“解决”。不确定这是否是使用Qt API的正确方法。 LASTVAL()在交易中是安全的。