[英]MySQL+PHP: getting last_id of multiple/composite primary key
我需要獲取具有多列主鍵的表的最后插入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解析器的情況下,這可能是簡單的方法嗎?
我很確定這個問題已經有了答案,但我找不到任何東西......
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.