Rails:为什么添加唯一约束会删除struct.sql文件和db中的索引

问题描述 投票:0回答:1

最初这个问题被标记为重复: Postgres 唯一约束与索引

但我不是问唯一约束与唯一约束的区别 索引,这就是为什么我更新了问题标题以使其更清晰。

我想知道为什么添加使用唯一索引的唯一约束只会删除索引,让我详细解释一下,我有以下迁移:

class AddUniqueIndexOnNamesForProgramsSuppliersCollections < ActiveRecord::Migration[5.2]
  disable_ddl_transaction!

  def up
    execute("CREATE UNIQUE INDEX CONCURRENTLY idx_supplier_company_id_and_name_unique ON public.suppliers USING btree (company_id, name);")
    execute("CREATE UNIQUE INDEX CONCURRENTLY idx_programs_company_id_and_name_unique ON public.programs USING btree (company_id, name);")
    execute("CREATE UNIQUE INDEX CONCURRENTLY idx_collections_supplier_id_and_name_unique ON public.collections USING btree (supplier_id, name);")
  end

  def down
    remove_index :suppliers, name: :idx_supplier_company_id_and_name_unique
    remove_index :programs, name: :idx_programs_company_id_and_name_unique
    remove_index :collections, name: :idx_collections_supplier_id_and_name_unique
  end
end

当我运行上述迁移时,我将索引添加到我的

structure.sql
文件中。然后我有另一个迁移:

class AddUniqueConstraintsOnNamesForProgramsSuppliersCollections < ActiveRecord::Migration[5.2]
  disable_ddl_transaction!

  def up
    sql = <<~END_OF_SQL
      ALTER TABLE public.suppliers ADD CONSTRAINT supplier_company_id_and_name_unique UNIQUE USING INDEX idx_supplier_company_id_and_name_unique;
      ALTER TABLE public.programs ADD CONSTRAINT programs_company_id_and_name_unique UNIQUE USING INDEX idx_programs_company_id_and_name_unique;
      ALTER TABLE public.collections ADD CONSTRAINT collections_supplier_id_and_name_unique UNIQUE USING INDEX idx_collections_supplier_id_and_name_unique;
    END_OF_SQL

    execute(sql)
  end

  def down
    sql = <<~END_OF_SQL
      ALTER TABLE public.suppliers DROP CONSTRAINT supplier_company_id_and_name_unique;
      ALTER TABLE public.programs DROP CONSTRAINT programs_company_id_and_name_unique;
      ALTER TABLE public.collections DROP CONSTRAINT collections_supplier_id_and_name_unique;
    END_OF_SQL
    execute(sql)
  end
end

当我运行第二个迁移时,索引将从我的

structure.sql
文件和数据库中删除,并添加约束,所以我的猜测是它正在用约束替换索引,但我想两者都有,知道吗?

sql ruby-on-rails ruby postgresql activerecord
1个回答
0
投票

PostgreSQL 中的一条规则是约束的名称与实现它的索引的名称相同。

所以如果你写

ALTER TABLE tab ADD UNIQUE USING INDEX abc;

约束将被称为

abc
,如果你写

ALTER TABLE tab ADD CONSTRAINT def UNIQUE USING INDEX abc;

索引

abc
将重命名为
def

© www.soinside.com 2019 - 2024. All rights reserved.