我正在尝试向我的db(key
)添加一个列,它既是唯一的又不是null。在我的迁移中,我有填充列的代码。问题是迁移失败,因为它在添加数据之前添加了此唯一/非空约束,然后抱怨存在现有密钥。
这是我需要两次迁移的地方 - 一个是添加列/数据,另一个是添加约束?或者这可以一次完成吗?
理想情况下,在这种情况下,建议创建一个名为Stage Table(STG_YOUr table_name)的新表,该表与具有较少约束的原始表非常相似。在此完成所有数据转换/操作,然后准备好MERGE或插入到原始生产表中。
我不建议在迁移中填充数据。我发现最好让迁移只关注对数据库结构的物理更改。您应该创建rake任务来操纵数据。实际上,您应该将数据操作方法放在模型中(并对其进行单元测试),并让您的rake任务委托给这些方法。然后,您可以在运行所有迁移之后运行rake任务,或者混合单个迁移和rake任务。
迟到的答案,但我希望这对其他人有帮助,如果不是那个问这个问题的人!
据我说,您应该删除该列并再次进行,如下所示:
alter table students drop column email;
alter table students add column email varchar (80) unique not null;
这里的电子邮件是唯一但是为null的列,因此我将其删除,然后通过所需的属性将其重新添加到表中。
希望这有助于......