我正在尝试有条件地将一些数据插入到表中,其中列值的每个组合最多只能在表中出现一次。架构看起来像这样:
CREATE TABLE foobar (
id SERIAL PRIMARY KEY,
a_id INTEGER,
b_id INTEGER,
c_id INTEGER,
ident VARCHAR(32),
date_a timestamp,
date_b timestamp,
FOREIGN KEY a_id REFERENCES a (id) ON DELETE CASCADE,
FOREIGN KEY b_id REFERENCES b (id) ON DELETE CASCADE,
FOREIGN KEY c_id REFERENCES c (id) ON DELETE CASCADE));
(a_id, b_id, c_id, ident) 的组合是唯一的,但仅适用于 date_a AND date_b 均为 NULL 的行。
只有当 a_id、b_id、c_id、任务组合不在数据库中时,我才希望能够插入新行。如果是,它不需要做任何事情。
起初我尝试在这些列上创建唯一约束,但问题是允许 a_id、b_id 和 c_id 为 NULL,只要其中至少一个不为空。这破坏了唯一约束。因为 a、b 和 c_id 字段是外键,所以我不能将它们设置为其他一些存根值(如 -1)。
我尝试使用锁定(与我更好的判断相反),这在测试的几分钟内导致了死锁。
这个问题有没有标准的解决方案?