NodeJS Prisma,只有一个用户的行可以具有“true”值,@@unique(userId,isActive)

iyfjxgzm  于 2023-05-06  发布在  Node.js
关注(0)|答案(1)|浏览(117)

我有一个表的项目,一个用户可以有多个项目,但只有一个活动的同时。但是**@@uniquedocs告诉所有字段必须不为空**,也就是说用户只能有两项:一开一关
Here我看到我需要创建另一个表,其中包含指向Item的指针isActive值,但您不能确定只启用了一个Item。
我不想在这里使用空值,并且postgres连接器没有复合约束。你知道解决办法吗?

b1zrtrql

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,表将不允许“激活”另一个:

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 indexdemo

create table test(
  userid int, 
  isactive boolean,
  misc text);

create unique index my_partial_unique  
  on test (userid) 
  where isactive is true;

where条件阻止该索引约束将isactive设置为falsenull的记录。它仅在设置为true时适用,每个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),但您可以将其编辑为迁移。

相关问题