所以合约可以有很多服务。连接表是 ContractsService(contracts_services),非常简单。
索引设置为:
def change
add_index :contracts_services, [:contract_id, :service_id], unique: true
end
如果我尝试像这样添加(或通过 API,或以任何方式,所以不特定于这段代码):
ContractsService.where(contract_id: 16, service_id: 17).first_or_create!
我收到此错误:
ActiveRecord::RecordNotUnique: PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "index_contracts_services_on_contract_id_and_service_id"
DETAIL: Key (contract_id, service_id)=(16, 17) already exists.
但是:
irb(main):015:0> ContractsService.where(contract_id: 16, service_id: 17).count
D, [2017-10-26T07:25:01.782432 #4] DEBUG -- : (1.7ms) SELECT COUNT(*) FROM "contracts_services" WHERE "contracts_services"."deleted_at" IS NULL AND "contracts_services"."contract_id" = $1 AND "contracts_services"."service_id" = $2 [["contract_id", 16], ["service_id", 17]]
=> 0
我被困在这里了,以前从未见过这个。我错过了一些简单的事情吗?或者索引已损坏?还有别的吗?
最佳答案
似乎您在 ContractsService
模型中有 default_scope
。
查看 SQL:"contracts_services"."deleted_at"IS NULL
并且您的唯一索引不包含 deleted_at
列。
如果您尝试ContractsService.rewhere(contract_id: 16, service_id: 17).count
那么您应该找到这条记录
关于ruby-on-rails - RoR/Postgres - 两列唯一索引错误。 "duplicate key value violates unique constraint",即使没有任何记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46948175/