Rails 中的 Mysql 约束数据库条目

标签 mysql ruby-on-rails database constraints

我正在使用 Mysql 5 和 Ruby On Rails 2.3.1。我有一些验证有时无法防止重复的项目保存到我的数据库中。是否可以在数据库级别限制基于某些参数创建重复条目?

我正在将电子邮件保存到数据库,并且不想保存重复的主题行、正文和发件人地址。有谁知道如何通过迁移对数据库施加这样的限制?

最佳答案

您有多种选择来确保将唯一值集插入到表中。让我们考虑 1) 将责任推给数据库引擎或 2) 您的应用程序的责任。

将责任推给数据库引擎可能需要在表上创建唯一索引。请参阅MySql Create Index syntax 。请注意,如果插入重复值,此解决方案可能会导致引发异常。当您已经确定了我推断的三列来确定唯一性(主题行、正文和发件人地址)时,您将创建索引以包含所有三列。自从我使用 Rails 以来已经有一段时间了,因此您可能还想检查插入的记录数。

如果您希望将此责任推给您的应用程序软件,您将需要应对潜在的数据插入冲突。也就是说,假设您有两个用户同时创建一封具有相同主题行、正文和发送地址的电子邮件(只需在此处与我合作)。如果您的代码简单查询由文本组成的任何记录(本示例中的两个用户都相同),则两者都将返回未找到的记录,并且将继续愉快地插入他们的电子邮件,这现在违反了您的前提。因此,您可以使用表锁或数据库中的其他同步字段来解决此问题,以确保不会出现重复项。后一种方法可以包含另一个表,该表具有单个字段,指示某人是否正在插入记录,一旦完成,它就会更新该记录以表明它已完成,然后其他人可以继续。

虽然您可以就每个替代方案的含义进行单独的架构讨论,但我会将其留给单独的帖子。希望这足以回答您的问题。

关于Rails 中的 Mysql 约束数据库条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1954299/

相关文章:

php - 为 CakePHP 定义数据库中的关系

php - 将 IP 地址与 IP 范围匹配?

ruby-on-rails - Rails 模型 - 更新 JSON 中的嵌套键/值

ruby-on-rails - 如何为 ActiveAdmin 上的某些操作添加范围

mysql - 为mysql中的特定数据库指定数据目录

php - 如何在表格标题中添加图像?

mysql - 可以优化 Temporal Property 查询以删除 MAX 子查询吗?

ruby-on-rails - 遍历数据库中的每条记录 - Ruby on Rails/ActiveRecord

mysql - 需要指导 : FIrst time going to work with real high end database (size = 50GB).

MySQL:选择线程和帖子,按最新事件排序