开发者

Adding an one-out-of-two not null constraint in postgresql

开发者 https://www.devze.com 2023-02-19 20:19 出处:网络
If I have a table in Postgresql: create table Education ( idinteger references Profiles(id), finishedYe开发者_Go百科arValue not null,

If I have a table in Postgresql:

create table Education ( 
    id                  integer references Profiles(id),
    finished            Ye开发者_Go百科arValue not null,
    started             YearValue,
    qualification       text,
    schoolName          text,
    studiedAt           integer references Organizations(id),
    primary key (id)
);

I need to make a constraint so that either schoolName or studiedAt needs to not be null (one of them has to have information in it).

How do I do this?


You can use a check constraint e.g.

constraint chk_education check (schoolName is not null or studiedAt is not null)

From the manual:

A check constraint is the most generic constraint type. It allows you to specify that the value in a certain column must satisfy a Boolean (truth-value) expression.

Edit: Alternative to comply with Pithyless' interpretation:

constraint chk_education check ((schoolName is not null and studiedAt is null) or (schoolName is null and studiedAt is not null))


You can also use a trigger on update and insert to check that a rule is followed before allowing the data into the table. You would normally use this type of approach when the check constraint needs more complicated logic.


This is my solution for sequelize migration file in "up" function

queryInterface.addConstraint('Education', {
  fields: ['schoolName', 'studiedAt'],
  type: 'check',
  name: 'schoolName_or_studiedAt_is_null',
  where: { [Sequelize.Op.or]: [{ password: null }, { googleId: null }] },
}),
0

精彩评论

暂无评论...
验证码 换一张
取 消