我需要获取具有多列主键的表的最后插入ID。
例如:
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。为了保持一致性,我想返回该值。
答案 0 :(得分:4)
正如Phil在评论中指出的那样,MySQL LAST_INSERT_ID()
只能返回自动生成的值(AUTO_INCREMENT)。
此外,您不能在多列上使用auto_increment:如果您有多个主键,则只能在1列上执行auto_increment。
总之,在您的情况下,您无法使用LAST_INSERT_ID()
插入密钥。
解决方案是在PHP中处理这种情况,以便 getInsertedId()方法返回为插入提供的主键值。
答案 1 :(得分:1)
当记录为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 ;
注意:只有当表中没有自动初始化和/或自动更新值的表中的时间戳时,才能执行。