我看到add_index ~ unique: true
聲明schema.rb
,認爲唯一性約束對於表,不爲指數。採用指數的方式來實現獨特的一個,程序員不應該指定的RDBMS「如何」和索引加快搜索,但削減成本插入。事實上,是否有另一種方法來保持唯一性約束?如果沒有,爲什麼Rails只爲我們提供唯一性約束的add_index
聲明?Can Rails可以處理沒有索引的數據庫唯一性嗎?
回答
因爲沒有其他需要。在引擎蓋下,它們都是一樣的:當你定義一個UNIQUE
約束時,會在該表上創建一個UNIQUE
索引來強制執行它。從DBA.SE
問:When should I use a unique constraint instead of a unique index?
因此,對於支持這兩種功能選擇,其中使用往往會歸結爲喜歡的樣式和一致性的數據庫。
所以在Rails中無處不在使用索引是一致的。這就是原因。
-
PostgreSQL自動當唯一約束或主鍵爲表中定義的唯一索引。該索引涵蓋組成主鍵或唯一約束的列(如果適用,則爲多列索引),並且是實施約束的機制。
我沒有找到權威人士的相關引用的MySQL,但是「謠言到處都是」。
謝謝,我想知道添加唯一索引是否只有一個**約束唯一性的方法,事實根據您的回答是如此。然而,這個語法是針對在數據庫中知道唯一性實現的用戶,我認爲它不好......(這可能是常識) – lastcat
@lastcat假設「你可以約束表的列是唯一的」來自以前的經驗與RDBMS,而不是常識。 Rails從那些知道它的人那裏獲得了這種可能性,然而,它卻很清楚地記錄了做它的最佳方式。 –
確保唯一性約束的唯一安全方法是在數據庫級別執行該操作。它沒有什麼不對,事實上,這是真正的正確方法。任何數據庫設計師或管理員都會向您確認。
Rails提供了唯一性驗證程序,但它並不完全安全。事實上,它是基於對數據庫的簡單查詢,但select和insert之間有一小段時間間隔,這使得它成爲可能(並且很可能在高併發系統中,或者如果插入的數量合理的時間)有一個由於這種競爭條件而創建的重複記錄。
因此,唯一保證唯一性的方法是在數據庫上有一個唯一索引。如果您關心它,您可能需要閱讀一些數據庫設計書或資源,以不同的觀點重新評估問題。
你仍然希望在你的模型中進行驗證的原因是因爲數據庫(通常)不會以努力以用戶友好的方式解決衝突。模型中的驗證將預先驗證數據並防止DBMS引發異常。您可以檢查驗證結果並向用戶顯示友好的信息。
儘管如此,數據庫約束仍將存在,如果您的驗證因前面提到的競爭條件而通過,您的數據完整性將由DBMS確保引發異常。
- 1. 在Rails數據庫中處理併發請求的唯一性
- 2. Can Orchard ActivatingFilters可以批處理嗎?
- 3. Can Rails模式表可以在數據庫之外嗎?
- 4. Can Hive可以處理二進制數據嗎?
- 5. 將數據庫索引添加到已有數據的數據庫可以嗎?
- 6. Can Rails數組可以「解壓縮」嗎?
- 7. 有沒有可以跟蹤唯一錯誤的Rails庫?
- 8. Can Django管理員可以處理數百萬條記錄嗎?
- 9. 我們可以有一個非唯一索引PK嗎?
- 10. Can Meteor的Appcache也可以存儲數據庫數據嗎?
- 11. MongoDB複合索引可以在字段的子集上具有唯一性嗎?
- 12. MySQL InnoDB數據庫可以具有外部列唯一性約束嗎?
- 13. Can Django可以在AJAX響應後進一步處理嗎?
- 14. 索引名稱需要在數據庫中唯一嗎?
- 15. Can Corda CRaSH Shell可以處理UniqueIdentifier fow參數值嗎?
- 16. Can Solr可以處理表table1,table2,... tableN中的表的數據導入嗎?
- 17. MongoDB可以處理TB的數據嗎?
- 18. Oracle數據庫,將唯一索引轉換爲非唯一索引
- 19. Can Coda可以訪問我的AWS數據庫嗎?
- 20. CouchDB可以處理數千個獨立的數據庫嗎?
- 21. 我可以有4列索引,並將其設置爲Rails應用程序postgresql數據庫中唯一?
- 22. 數據庫索引檢查插入之前vs唯一索引
- 23. 已有數據庫表中的唯一索引
- 24. 可以處理數據庫的網站
- 25. 有沒有一個PHP IDE可以處理Magento的代碼庫?
- 26. Can類可以相互引用嗎?
- 27. Can Keras可以處理不同大小的輸入圖像嗎?
- 28. Can Meteor可以處理嵌套的依賴關係嗎?
- 29. Can Django Syncdb可以處理壓縮的initial_data.json.tgz文件夾嗎?
- 30. 彈性搜索我可以刪除所有數據的索引
'add_index〜unique:true'它只是說在列上添加索引,索引對於該列應該是唯一的。因爲我們不想要重複的索引條目。 –
http://stackoverflow.com/questions/14622143/adding-unique-true-for-add-column-and-add-index-in-active-record –
在模型中,你可以簡單地嘗試'validates:field_name,uniqueness:真正的http://guides.rubyonrails.org/active_record_validations.html#uniqueness –