当列在 Postgres 中可以为空时处理索引冲突
Handling conflicts on Index when columns are nullable in Postgres
假设我有一个 table 像:
CREATE TABLE test (id SERIAL, first VARCHAR(10), second VARCHAR(10), other VARCHAR(10));
CREATE UNIQUE INDEX unique_index ON test (first, second);
INSERT INTO test (first, second, other)
VALUES ('lorem', null, 'old');
如果我填充此列并使索引中的第二个字段为空,但在空=空的冲突中要更新什么,我该怎么做?目前,当更新插入值也为 null 时,我没有遇到冲突。
INSERT INTO test (first, second, other)
VALUES ('lorem', null, 'new')
ON CONFLICT (first, second)
DO UPDATE SET
other = EXCLUDED.other;
我会得到这样的输出:
1 lorem (null) old
2 lorem (null) new
如果我将第二列设置为任何值,这会起作用,但当它们为空时不会发生冲突。为什么?我该如何解决这个问题?
您可以在表达式上创建索引。经常起作用的是:
CREATE UNIQUE INDEX unique_index ON test (COALESCE(first, ''), COALESCE(second, ''));
当然,这假定 ''
不是有效的字段值。你总是可以把别的东西放进去。 . .比如'<null>'
.
假设我有一个 table 像:
CREATE TABLE test (id SERIAL, first VARCHAR(10), second VARCHAR(10), other VARCHAR(10));
CREATE UNIQUE INDEX unique_index ON test (first, second);
INSERT INTO test (first, second, other)
VALUES ('lorem', null, 'old');
如果我填充此列并使索引中的第二个字段为空,但在空=空的冲突中要更新什么,我该怎么做?目前,当更新插入值也为 null 时,我没有遇到冲突。
INSERT INTO test (first, second, other)
VALUES ('lorem', null, 'new')
ON CONFLICT (first, second)
DO UPDATE SET
other = EXCLUDED.other;
我会得到这样的输出:
1 lorem (null) old
2 lorem (null) new
如果我将第二列设置为任何值,这会起作用,但当它们为空时不会发生冲突。为什么?我该如何解决这个问题?
您可以在表达式上创建索引。经常起作用的是:
CREATE UNIQUE INDEX unique_index ON test (COALESCE(first, ''), COALESCE(second, ''));
当然,这假定 ''
不是有效的字段值。你总是可以把别的东西放进去。 . .比如'<null>'
.