我有一个表的项目,一个用户可以有多个项目,但只有一个活动的同时。但是**@@uniquedocs告诉所有字段必须不为空**,也就是说用户只能有两项:一开一关。Here我看到我需要创建另一个表,其中包含指向Item的指针和isActive值,但您不能确定只启用了一个Item。我不想在这里使用空值,并且postgres连接器没有复合约束。你知道解决办法吗?
b1zrtrql1#
solution you linked可以用来工作:您不能确定只启用了一个项目您***可以***通过向“带指针的TrueRow表”添加唯一约束来确保仅启用一个Item:demo
create table users(id int primary key); insert into users values (1),(2); create table test2( id int primary key, userid int not null references users(id), misc text); insert into test2 (id,userid,misc) values (1, 1, 'a'), (2, 1, 'b'), (3, 1, 'c'); create table true_row( fk_userid int not null references users(id) unique, fk_test2_id int not null references test2(id) ); insert into true_row (fk_userid,fk_test2_id) values (1,3);
现在第三个条目被选为唯一的行,其中isactive将是true,表将不允许“激活”另一个:
isactive
true
insert into true_row (fk_userid,fk_test2_id) values (1,2); --ERROR: duplicate key value violates unique constraint "true_row_fk_userid_key" --DETAIL: Key (fk_userid)=(1) already exists.
通常,您可以使用partial unique index:demo
create table test( userid int, isactive boolean, misc text); create unique index my_partial_unique on test (userid) where isactive is true;
where条件阻止该索引约束将isactive设置为false或null的记录。它仅在设置为true时适用,每个userid只允许一个这样的条目。
where
false
null
userid
insert into test values (1, false, 'a'), (1, false, 'b'), (1, true, 'c'); insert into test values (1, true, 'd'); --ERROR: duplicate key value violates unique constraint "my_partial_unique" --DETAIL: Key (userid)=(1) already exists. update test set isactive=true where userid=1 and misc='b'; --ERROR: duplicate key value violates unique constraint "my_partial_unique" --DETAIL: Key (userid)=(1) already exists.
不幸的是,Prisma还不支持该功能(#3076,#6974),但您可以将其编辑为迁移。
1条答案
按热度按时间b1zrtrql1#
solution you linked可以用来工作:
您不能确定只启用了一个项目
您***可以***通过向“带指针的TrueRow表”添加唯一约束来确保仅启用一个Item:demo
现在第三个条目被选为唯一的行,其中
isactive
将是true
,表将不允许“激活”另一个:通常,您可以使用partial unique index:demo
where
条件阻止该索引约束将isactive
设置为false
或null
的记录。它仅在设置为true
时适用,每个userid
只允许一个这样的条目。不幸的是,Prisma还不支持该功能(#3076,#6974),但您可以将其编辑为迁移。