6

我需要获取具有多列主键的表的最后插入 id。

  • 这些表没有 AUTOCOUNT 列。
  • 我正在使用参数化查询(任意顺序)
  • 使用 PHP (5.3) 和 MySQLi 模块
  • 任意 INSERT SQL 查询。(任何格式)

例如:

Table: foo
Primary key: [ group_id , user_id ]
Query: INSERT INTO foo (group_id, user_id, name, email) VALUES (?, ?, ?, ?);
Parameters: array(34,15,"John","john@example.com")

结果: $last_id = $mysqli->insert_id ?: getInsertedId() ;

34,15

此时我有一个名为 getPK() 的函数,它返回给我:

array("group_id","user_id");

我现在需要的是实现getInsertedId()。在不使用 SQL 解析器的情况下,这可能是最简单的方法?

我很确定这个问题已经有了答案,但我找不到任何东西......

更新

我问这个问题的原因是因为我有一个类可以控制与 MySQL 数据库相关的所有内容(个人框架的一部分)。我有一种称为set()的方法,其中传递了查询(如 UPDATE、INSERT、DELETE 等)。我还有其他特定的方法,例如insert(),其中传递了数组。

我有一个存储last_inserted_id 的变量。以后可以随时调用该变量。我在具有多个主键的不同系统中有许多表。使用insert()方法时,设置 last_inserted_id 值没有问题,但是当某些系统使用set()方法时,我无法检索该值,我必须返回 0。我想更改该行为。

我想用上面的例子来简化我的解释。

更新 2

并非所有系统都由我自己控制。例如,其中一个系统调用soap 方法,在该方法中发送查询以执行(任何类型的查询)。这些由set()方法处理。然后还有其他soap方法可以检索最后一个id。为了保持一致性,我想返回该值。

4

2 回答 2

5

正如 Phil 在评论中指出的那样,MySQLLAST_INSERT_ID()只能返回自动生成的值 (AUTO_INCREMENT)。

此外,您不能在多列上使用 auto_increment:如果您有多个主键,则 auto_increment 只能在 1 列上使用。

总之,您无法LAST_INSERT_ID()在您的情况下使用插入的密钥。

一种解决方案是在 PHP 中处理这种情况,以便您的getInsertedId()方法返回为插入提供的主键的值。

于 2011-08-25T09:31:52.793 回答
0

您可以添加一个列,该列在每次更新记录时Timestamp自动初始化为当前时间戳:INSERTED

ALTER TABLE MyTable
  ADD COLUMN InsertTS TIMESTAMP DEFAULT CURRENT_TIMESTAMP
, ADD INDEX InsertTS_ind (InsertTS) ;

您还要确保没有其他查询、函数或触发器更改该值。然后,您可以使用查询来查找具有最高时间戳的记录的 PK:

SELECT group_id, user_id
FROM MyTable
ORDER BY InsertTS DESC
LIMIT 1 ;

注意只有在表中还没有获得自动初始化和/或自动更新值的时间戳时,才能执行此操作。

于 2011-08-25T10:16:54.893 回答