2010-02-18 114 views
2

今天早些時候,我問了this question哪些產生於A-我的不良計劃和B-我完全無視正常化數據庫的做法。我花了最近8個小時閱讀關於正常化數據庫和JOIN的更精細的點,並通過SQLZoo.com教程工作。如何獲取我剛剛插入的文件的主鍵ID?

我開悟了。我理解數據庫規範化的目的以及它如何適合我。除了我不完全確定如何從程序角度來執行這個願景。

這是我的舊願景:一個名爲「文件」的表格,讓我們說一個文件ID和一個文件url以及該文件的appropos等級。

新視野!:1個表格用於「文件」,1個表格用於「成績」,以及一箇中介表格。

但這不是我的問題。這是一個非常基本的問題,我肯定有一個明顯的答案 - 當我在「文件」中創建一條記錄時,它會自動分配遞增的主鍵(file_id)。但是,從現在開始,我需要將該file_id寫入其他表中。因爲我沒有手動分配該ID,所以我怎麼知道它是什麼?

如果我上傳text.doc並獲得file_id 123,我怎麼知道它得到了123才能將它寫入「等級」和聯結表?我不能做一個max(file_id),因爲如果你有併發用戶,你可能會獲得一個不同的ID。我只是不知道如何獲得file_id值而沒有手動分配它。

回答

3

您可能需要使用LAST_INSERT_ID()如下面的例子:

START TRANSACTION; 
INSERT INTO files (file_id, url) VALUES (NULL, 'text.doc'); 
INSERT INTO grades (file_id, grade) VALUES (LAST_INSERT_ID(), 'some-grade'); 
COMMIT; 

交易保證了操作保持原子:這保證了無論是這兩種刀片成功完成,或者根本沒有。這是可選的,但建議爲了保持數據的完整性。

對於LAST_INSERT_ID(),最 最近生成的ID被保持在 服務器上的每個連接的基礎。

它不會被另一個客戶更改。 它,如果你更新 另一AUTO_INCREMENT柱與 值魔法的甚至不改變(即值 不是NULL,而不是0)。

同時使用 LAST_INSERT_ID()AUTO_INCREMENT 列從多個 客戶是完全有效的。每個 客戶端將收到最後插入的 ID,用於客戶端 執行的最後一條語句。

來源和補充閱讀:

1

在程序忘記last_insert_id()的值後,你明天如何找到條目?

使用代理鍵很好,但你的表仍然代表一個實體,你應該能夠回答這個問題:什麼可測量的屬性定義這個特定的實體?這些屬性的集合是表的自然鍵,即使使用代理鍵,這樣的自然鍵也應該始終存在,您應該使用它來從表中檢索信息。使用代理鍵強制引用完整性,爲索引建立索引並使聯接更容易。但是don't let them escape from the database

+0

實際文件表包含大量有關該文件的數據 - 上傳它的用戶,該文件的唯一S3 URL等 這裏的願景是,其他用戶根據一組瀏覽這些文件的搜索標準。我可以將文件的id發佈到顯示腳本並從那裏翻錄。 – GilloD 2010-02-19 02:24:53

相關問題