Olá, temos uma tabela chamada billing_infos , onde um índice parcial é criado em três campos, , account_id
e state_id
onde deleted_at
está deleted_at
, NULL
Minha expectativa é que a operação de inserção falhe ao tentar inserir valores duplicados para account_id
, state_id
, deleted_at = null
. Mas parece que está criando outra entrada com duplicatas. Existe alguma advertência com índice parcial quando verificamos com condição nula, examinei a documentação oficial , mas não consegui encontrar uma, abaixo está o trecho do meu esquema de tabela
porterbizz=> \d+ application.billing_infos; Mesa
"application.billing_infos"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
-----------------+-----------------------------+-----------+----------+-------------------------------------------------------+----------+--------------+-------------
id | integer | | not null | nextval('application.billing_infos_id_seq'::regclass) | plain | |
account_id | integer | | not null | | plain | |
gst_in | character varying(256) | | not null | | extended | |
gst_reg_address | character varying(256) | | not null | | extended | |
invoice_address | character varying(256) | | not null | | extended | |
state_id | integer | | not null | | plain | |
default | boolean | | not null | false | plain | |
deleted_at | timestamp without time zone | | | | plain | |
Indexes:
"billing_infos_pkey" PRIMARY KEY, btree (id)
"account_id_state_id_deleted_at_uniq_index" UNIQUE, btree (account_id, state_id, deleted_at) WHERE deleted_at IS NULL
Remova
deleted_at
de seu índice exclusivo parcial porquenull
nunca é igual a nada, nem mesmo a outronull
.Sem o
deleted_at
, a exclusividade é aplicada:Mas inclua
deleted_at
no índice e as inserções duplicadas são bem-sucedidas:Violino de trabalho