簡體   English   中英

MySQL + PHP:獲取多個/復合主鍵的last_id

[英]MySQL+PHP: getting last_id of multiple/composite primary key

我需要獲取具有多列主鍵的表的最后插入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解析器的情況下,這可能是簡單的方法嗎?

我很確定這個問題已經有了答案,但我找不到任何東西......

UPDATE

我問這個問題的原因是因為我有一個控制與MySQL數據庫相關的一切的類(個人框架的一部分)。 我有一個名為set()的方法,其中傳遞查詢(如UPDATE,INSERT,DELETE等)。 我有其他特定的方法,如insert() ,其中傳遞數組。

我有一個變量,我存儲了last_inserted_id。 該變量可以在以后隨時調用。 我在不同系統中有許多具有多主鍵的表。 使用insert()方法時,設置last_inserted_id值沒有問題,但是當某些系統使用set()方法時,我無法檢索該值,我必須返回0.我想改變這種行為。

我想通過上面的例子簡化我的解釋。

更新2

並非所有系統都由我自己控制。 例如,其中一個系統調用soap方法,在該方法中發送查詢以執行(任何類型的查詢)。 這些由set()方法處理。 然后還有其他soap方法,其中檢索最后一個id。 為了保持一致性,我想返回該值。

正如Phil在評論中指出的那樣,MySQL LAST_INSERT_ID()只能返回自動生成的值(AUTO_INCREMENT)。

此外,您不能在多列上使用auto_increment:如果您有多個主鍵,則auto_increment只能在1列上執行。

總之,在您的情況下,無法使用LAST_INSERT_ID()插入密鑰。

解決方案是在PHP中處理這種情況,以便getInsertedId()方法返回為插入指定的主鍵值。

您可以添加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 ;

注意只有在表中沒有獲得自動初始化和/或自動更新值的時間戳時,才能執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM