【问题标题】:UNIQUE constrain using Rails Migrations [duplicate]使用 Rails 迁移的唯一约束 [重复]
【发布时间】:2020-08-14 04:53:40
【问题描述】:

是否可以使用 Rails 迁移将 UNIQUE 约束添加到新表的列?

我尝试在创建表时添加约束,如下所示:

t.string :username, unique: true

它不起作用

另一个选项是:

add_index :authors, :username, unique: true

但这会创建一个索引,并且不会在列上添加唯一约束。

我使用 Rails 5.2 和 SQlite 对其进行测试。

澄清一下,我尝试归档的内容与此 SQL 查询相同:

CREATE TABLE authors(
    username TEXT UNIQUE
);

但如果可能,使用 Rails 迁移。

请注意,即使我们得到类似的行为,add_index 选项也不会在列上添加唯一约束。

【问题讨论】:

  • 使用具有唯一性约束的索引是正确的做法。如果由于某种原因无法将您的问题与高度支持的重复问题区分开来,因为它有许多高度支持的答案,那么请解释为什么链接的答案不起作用。
  • 如果你打开数据库,你会看到那里的列仍然没有 UNIQUE 约束,所以没有解决。索引不是唯一约束,即使它们具有相似的行为。
  • 这里可能有误会;唯一性约束不是在列上设置的,而是在索引上设置的。如果它设置在索引上,那么您不能创建重复记录。 (因为索引不允许它)
  • 假设所有其他数据库是安全的,否则您正在执行全表扫描以检查唯一性。 (这是你说你喜欢做的,这没有意义)在任何一种情况下(全表扫描或使用索引)它都发生在数据库端并且与你的应用程序分开。 (任何应用程序对数据库的任何查询都会受到限制)
  • 还有其他差异,但这是一个巨大的差异。至于更改它,假设您有 COL_1 并且它有一个 UNIQUE 约束:您可以创建一个迁移,在其中添加 COL_2 没有约束,将数据从 COL_1 复制到 COL_2,然后删除 @987654329 @,然后将 COL_2 重命名为 COL_1,尽管您必须确保全部完成 within a transaction。即便如此,根据所使用的 SQL 数据库的类型,锁可能会很不稳定,所以要小心!

标签: ruby-on-rails ruby migration


【解决方案1】:

您可以对用户的输入字段验证进行唯一性检查。

由于已经在应用程序端提供了该功能,我相信 Active Record 迁移确实对后端关系数据库端的范围有其自身的限制。

https://guides.rubyonrails.org/active_record_migrations.html#active-record-and-referential-integrity

【讨论】:

  • 就像你说的,在验证时我们可以检查值是否唯一,但列仍然没有 UNIQUE 约束。
  • 如果我的意思是数据输入的唯一方式是来自前端,那么唯一约束的后端逻辑应该无关紧要。希望对你有帮助
  • 注意,如果 Helpers 不够用,也可以在迁移文件中添加自定义 SQL guides.rubyonrails.org/…
  • 所以我们没有迁移的助手,但是我们可以在迁移中使用 SQL 查询,如果你发帖我会标记为接受。
猜你喜欢
  • 2022-01-14
  • 2011-08-06
  • 2016-01-10
  • 1970-01-01
  • 2012-10-15
  • 2012-11-06
  • 2018-08-05
  • 2011-03-23
  • 1970-01-01
相关资源
最近更新 更多