添加索引迁移中的唯一性被忽略
Posted
技术标签:
【中文标题】添加索引迁移中的唯一性被忽略【英文标题】:uniqueness in add index migration is ignored 【发布时间】:2021-12-17 21:22:16 【问题描述】:我正在尝试向现有索引添加唯一约束,因此我在迁移中删除并添加索引,一切正常,但是当我查看 postgres 时,我仍然看不到该索引上的任何唯一约束,并且我的 upsert 代码失败消息,该列上没有唯一索引
这是我的迁移
remove_index :company_lists, :company_id
add_index :company_lists, :company_id, :unique=> true
我错过了什么? 该列是外键,如果我尝试迁移以先删除外键然后添加,结果完全相同
编辑:我在迁移中也尝试了 SQL 代码,但结果相同,在 schema.rb 中我看到该列应该是唯一的,在 postgres 中我不认为它是唯一的
class AddUniqIndexToCompanyList < ActiveRecord::Migration[6.1]
def up
execute <<-SQL
DROP INDEX IF EXISTS index_company_lists_on_company_id;
CREATE UNIQUE INDEX index_company_lists_on_company_id on company_lists(company_id);
SQL
end
def down
execute <<-SQL
DROP INDEX IF EXISTS index_company_lists_on_company_id;
CREATE INDEX index_company_lists_on_company_id on company_lists(company_id);
SQL
end
end
【问题讨论】:
唯一属性是否出现在schema.rb
文件中?
是的,它出现在 schema.rb t.index ["company_id"],名称:"index_company_lists_on_company_id",唯一性:true
是的,迁移运行良好并且针对正确的数据库..如果我添加相同的迁移添加列或其他内容,我看到正确的表已修改
【参考方案1】:
好的,实际上这看起来像是我的 postgres 数据库管理器 (dbeaver-ce) 中的一个错误,它没有显示唯一检查
当我使用 \d+ company_lists 查看 psql 时,我发现索引具有 UNIQUE 约束
【讨论】:
以上是关于添加索引迁移中的唯一性被忽略的主要内容,如果未能解决你的问题,请参考以下文章