我看到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. Can Hive可以处理二进制数据吗?
- 2. 将数据库索引添加到已有数据的数据库可以吗?
- 3. Can Meteor的Appcache也可以存储数据库数据吗?
- 4. MongoDB复合索引可以在字段的子集上具有唯一性吗?
- 5. 索引名称需要在数据库中唯一吗?
- 6. Can Corda CRaSH Shell可以处理UniqueIdentifier fow参数值吗?
- 7. Can Solr可以处理表table1,table2,... tableN中的表的数据导入吗?
- 8. Oracle数据库,将唯一索引转换为非唯一索引
- 9. 已有数据库表中的唯一索引
- 10. CouchDB可以处理数千个独立的数据库吗?
- 11. 有没有一个PHP IDE可以处理Magento的代码库?
- 12. 可以处理数据库的网站
- 13. Can类可以相互引用吗?
- 14. Can Keras可以处理不同大小的输入图像吗?
- 15. Can Django Syncdb可以处理压缩的initial_data.json.tgz文件夹吗?
- 16. hbase如何处理与数据表的索引表一致性?
- 17. Can Flyway可以与非托管数据库对象共存吗?
- 18. ergm/statnet包可以处理缺少的属性数据吗?
- 19. 我可以拥有没有聚集索引的主键吗?我也可以拥有多值聚簇索引吗?
- 20. 没有前导零SQL唯一索引
- 21. Matlab:我可以通过唯一名称引用数组索引吗?
- 22. 外键可以使用唯一索引吗?
- 23. Can $ self可以传递给XML :: Twig处理程序吗?
- 24. Can WatiN可以处理CuteWebUI Uploader弹出对话框吗?
- 25. 裸仓库可以有索引吗?这是一个错误?
- 26. NHibernate可以在QueryOver中使用数据库索引吗?
- 27. 我们可以使用solr索引图形数据库吗?
- 28. Can Swift Generics可以帮助一个函数根据类来处理不同的参数吗?
- 29. FuelPHP ORM可以处理这个数据库设计吗?
- 30. 我可以在TransactionScope中从数据库检索数据吗?
'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 –