添加索引迁移中的唯一性被忽略

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 约束

【讨论】:

以上是关于添加索引迁移中的唯一性被忽略的主要内容,如果未能解决你的问题,请参考以下文章

mongoDB 3.2中的唯一索引忽略空值

在 MongoDB 中添加唯一索引忽略空值

如何创建唯一索引

忽略空间的Oracle唯一约束和唯一索引

如何在 Ruby on Rails 迁移中使列唯一并为其编制索引?

具有唯一索引的房间数据库迁移问题