【问题标题】:Postgres - set unique constraint in a column based on another columnPostgres - 在基于另一列的列中设置唯一约束
【发布时间】:2020-05-16 13:22:54
【问题描述】:

我有一张这样的桌子:

CREATE TABLE schema.mytable
(
  id serial NOT NULL,
  number integer NOT NULL,
  state boolean NOT NULL,
);

我需要创建一组唯一的“数字”,但状态列必须为真;如果状态栏为假,数字可以重复,这是我需要有效的示例:

id  number      state
1   123         true
2   124         true
3   125         true
4   123         false
5   129         false

如您所见,数字 123 重复了,但在一种情况下状态为假,另一种情况下为真;这是不正确的:

id  number      state
1   123         true
2   124         true
3   125         true
4   123         true (*incorrect)
5   129         false

另外,123 有可能重复两次或多次,状态为假;我怎样才能做到这一点?

【问题讨论】:

    标签: sql postgresql database-design sql-insert unique-constraint


    【解决方案1】:

    你不能有一个部分唯一的约束,但是你可以创建一个部分唯一的index,它实现了完全相同的功能:

    create unique index mytable_bk on mytable(number) where (state);
    

    Demo on DB FIddle

    insert into mytable(id, number, state) values(1, 123, false);
    -- 1 rows affected
    
    insert into mytable(id, number, state) values(1, 123, true);
    -- 1 rows affected
    
    insert into mytable(id, number, state) values(1, 123, false);
    -- 1 rows affected
    
    insert into mytable(id, number, state) values(1, 123, true);
    -- ERROR:  duplicate key value violates unique constraint "mytable_bk"
    -- DETAIL:  Key (number)=(123) already exists.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-08
      • 1970-01-01
      • 1970-01-01
      • 2021-04-10
      • 1970-01-01
      • 2011-09-16
      • 1970-01-01
      • 2015-03-06
      相关资源
      最近更新 更多