Jimmy
Jimmy

Reputation: 571

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

If I have a table in Postgresql:

create table Education ( 
    id                  integer references Profiles(id),
    finished            YearValue 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?

Upvotes: 56

Views: 25179

Answers (4)

Carlos Mendoza
Carlos Mendoza

Reputation: 1

Super late to the party, but this also works:

constraint validate_null check (not(schoolName is null and studiedAt is null))

Upvotes: 0

hellvisor
hellvisor

Reputation: 538

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 }] },
}),

Upvotes: 0

Aleksi Yrttiaho
Aleksi Yrttiaho

Reputation: 8446

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))

Upvotes: 84

Kuberchaun
Kuberchaun

Reputation: 30324

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.

Upvotes: 0

Related Questions