2009-12-23 18 views
0

我正在使用Mysql 5和Ruby On Rails 2.3.1。我有一些驗證,偶爾無法防止重複的項目被保存到我的數據庫。是否有可能在數據庫級別限制根據某些參數創建重複條目?Rails中的Mysql約束數據庫條目

我將電子郵件保存到數據庫,並且不想保存重複的主題行,正文和發件人地址。有誰知道如何通過遷移對數據庫施加這樣的限制嗎?

回答

1

您有許多選項可確保將唯一值集插入到表中。讓我們考慮1)將責任推給數據庫引擎或2)你的應用程序的責任。

將責任推到數據庫引擎可能需要使用在表上創建UNIQUE索引。見MySql Create Index syntax。請注意,如果插入重複值,此解決方案可能會導致拋出異常。正如您已經確定我推斷爲三列來確定唯一性(主題行,正文和發件人地址),您將創建索引以包含所有三列。自從我使用Rails以來,這已經有一段時間了,因此您可能還需要檢查插入的記錄數。

如果您希望將此責任推送給您的應用程序軟件,您需要應對潛在的數據插入衝突。也就是說,假設你有兩個用戶同時創建一個電子郵件(只是在這裏工作)具有相同的主題行,主體和發送地址。如果你的代碼簡單地查詢任何由文本組成的記錄(在這個例子中兩個用戶都是相同的),兩者都不會返回找到的記錄,並且將繼續順利地插入他們現在違反你的前提的郵件。因此,您可以使用表鎖或數據庫中的其他同步字段來解決此問題,以確保不會出現重複項。後一種方法可以由另一個帶有單個字段的表組成,表示某人是否插入了一條記錄,一旦完成,它會更新該記錄以表明它已完成,然後其他人可以繼續。

雖然在那裏你可以有一個單獨的架構討論每個替代方案的影響,我會留下一個單獨的職位。希望這足以回答你的問題。

+0

您可以在這樣 add_index軌添加索引(:門票,[:to_email,:body_hash,:主題]:獨特=>真實,:極限=> 255) 注意限制不是一部分的軌道版本,所以你必須得到這個插件: http://github.com/eparreno/mysql_index_length – Schneems