【发布时间】: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