我正在使用 Mysql 5 和 Ruby On Rails 2.3.1。我有一些验证有时无法防止重复的项目保存到我的数据库中。是否可以在数据库级别限制基于某些参数创建重复条目?
我正在将电子邮件保存到数据库,并且不想保存重复的主题行、正文和发件人地址。有谁知道如何通过迁移对数据库施加这样的限制?
最佳答案
您有多种选择来确保将唯一值集插入到表中。让我们考虑 1) 将责任推给数据库引擎或 2) 您的应用程序的责任。
将责任推给数据库引擎可能需要在表上创建唯一索引。请参阅MySql Create Index syntax 。请注意,如果插入重复值,此解决方案可能会导致引发异常。当您已经确定了我推断的三列来确定唯一性(主题行、正文和发件人地址)时,您将创建索引以包含所有三列。自从我使用 Rails 以来已经有一段时间了,因此您可能还想检查插入的记录数。
如果您希望将此责任推给您的应用程序软件,您将需要应对潜在的数据插入冲突。也就是说,假设您有两个用户同时创建一封具有相同主题行、正文和发送地址的电子邮件(只需在此处与我合作)。如果您的代码简单查询由文本组成的任何记录(本示例中的两个用户都相同),则两者都将返回未找到的记录,并且将继续愉快地插入他们的电子邮件,这现在违反了您的前提。因此,您可以使用表锁或数据库中的其他同步字段来解决此问题,以确保不会出现重复项。后一种方法可以包含另一个表,该表具有单个字段,指示某人是否正在插入记录,一旦完成,它就会更新该记录以表明它已完成,然后其他人可以继续。
虽然您可以就每个替代方案的含义进行单独的架构讨论,但我会将其留给单独的帖子。希望这足以回答您的问题。
关于Rails 中的 Mysql 约束数据库条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1954299/