2009-12-23 17 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