最初这个问题被标记为重复: 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
文件和数据库中删除,并添加约束,所以我的猜测是它正在用约束替换索引,但我想两者都有,知道吗?
PostgreSQL 中的一条规则是约束的名称与实现它的索引的名称相同。
所以如果你写
ALTER TABLE tab ADD UNIQUE USING INDEX abc;
约束将被称为
abc
,如果你写
ALTER TABLE tab ADD CONSTRAINT def UNIQUE USING INDEX abc;
索引
abc
将重命名为 def
。