我如何获取 SQL 中新插入的行的 PrimaryKey 值,该值应该适用于所有 SQL 库

Posted

技术标签:

【中文标题】我如何获取 SQL 中新插入的行的 PrimaryKey 值,该值应该适用于所有 SQL 库【英文标题】:How can i get PrimaryKey value for newly inserted row in SQL which should work on all SQL libraries 【发布时间】:2014-05-30 15:32:43 【问题描述】:

这个问题已经被问过很多次了,但由于以下并发症,我一直没有得到正确的答案:

第一个解决方案是使用 SQL 库/服务器相关的解决方案,如 getlastrowid()、SCOPE_IDENTITY() 等,但我希望解决方案至少在 SQLite、MSSQL、mysql、PSQL 之后适用于所有 SQL 实现。即使我设法为每个 SQL 实现使用不同的函数,我也遇到了这个问题,每当表上存在触发器插入的行时,触发器也会插入行,上面的函数返回触发器插入的行的 ID。

第二种解决方案很简单,我可以只使用事务,并且在插入行后的事务中我可以从表中调用 SELECT max(ID),这将给出新插入行的 ID,并且因为使用了事务,即使其他连接一直在尝试同时获取新 ID。问题是表将被锁定,如果连接不好,它可能会被锁定很长时间。 第三个是改用 GUID,但我在很多论坛上看到使用它不是一个好主意。

我正在使用 Qt 5.2 开发数据库应用程序。 所以我想知道是否还有其他方法可以获取新插入行的 ID 以用作下一行插入的外键。 我还想知道使用事务确实会阻止所有其他连接访问该表,尽管我知道 SQLite 确实会阻止所有其他连接,但想知道 MSSQL、MYSQL、PSQL。

【问题讨论】:

那么有没有其他方法可以将交易数据添加到 master 中? 他从未说过他为此使用 php 【参考方案1】:

您可以使用 Qt lastInsertId() 函数:http://qt-project.org/doc/qt-5/qsqlquery.html#lastInsertId,也就是说,如果您使用 QSqlQuery 来执行查询。

【讨论】:

正在考虑使用相同的功能,但我不确定它是否也适用于插入更多行的触发器。 如果它不起作用,我建议编写一个函数,根据使用的 SQL 引擎运行不同的查询,这样你就可以使用返回 id 的语句(就像 Postgresql 中的 RETURNING 一样),你会确定它是插入的 id。 它应该与触发器一起使用,它只会返回第一个插入条目的 ID。 我对 lastInsertId() 进行了一些检查,它确实适用于 AFTER、BEFORE 触发器,但如果用于 SQLite 中的“替代触发器”则不起作用。似乎我必须避免使用而不是触发器,尽管在插入/有条件地插入数据之前我需要这个触发器来操作数据。如果您知道任何其他选择这样做,请告诉我,或者我只需要在 APP 本身中执行此操作。

以上是关于我如何获取 SQL 中新插入的行的 PrimaryKey 值,该值应该适用于所有 SQL 库的主要内容,如果未能解决你的问题,请参考以下文章

Python/postgres/psycopg2:获取刚刚插入的行的 ID

TSQL获取刚刚插入的行的SQL Autonumber ID

如何获取由一个多行插入语句创建的行的所有 id

Oracle:如何获取刚刚插入的行的序列号?

如何获取 SQL 中具有 MAX 和 MIN 值的行的 ID

获取插入到雪花数据仓库中的行的标识