Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 941
Jimmy Avatar asked Mar 27 '11 07:03

Jimmy


People also ask

How do you add a NOT NULL constraint to an existing column?

To enforce NOT NULL for a column in SQL Server, use the ALTER TABLE .. ALTER COLUMN command and restate the column definition, adding the NOT NULL attribute.

How do I deal with not null in PostgreSQL?

Here is an example of how to use the PostgreSQL IS NOT NULL condition in a SELECT statement: SELECT * FROM employees WHERE first_name IS NOT NULL; This PostgreSQL IS NOT NULL example will return all records from the employees table where the first_name does not contain a null value.

Can we add not null constraint existing table?

It is possible to add a NOT NULL constraint to an existing table by using the ALTER TABLE statement. In this case, the column_name must not contain any NULL value before applying the NOT NULL constraint.

What does the not null constraint do in PostgreSQL?

The not-null constraint in PostgreSQL ensures that a column can not contain any null value. This is a column constraint. No name can be defined to create a not-null constraint. This constraint is placed immediately after the data-type of a column.


1 Answers

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)) 
like image 72
Aleksi Yrttiaho Avatar answered Sep 22 '22 14:09

Aleksi Yrttiaho