Если вам просто нужны уникальные записи в результате запроса, используйте SELECT DISTINCT
postgres=# SELECT * FROM test;
name | address | college
------+---------+---------
john | rome |
john | rome |
max | tokyo |
(3 rows)
postgres=# SELECT DISTINCT * FROM test;
name | address | college
------+---------+---------
john | rome |
max | tokyo |
(2 rows)
Если вы хотите применить уникальные записи, игнорируя нулевые значения, вы должны создать условный уникальный индекс
postgres=# CREATE UNIQUE INDEX test_index ON test (name, address) WHERE college IS NULL;
CREATE INDEX
postgres=# INSERT INTO test (name, address) VALUES ('john', 'rome');
INSERT 0 1
postgres=# INSERT INTO test (name, address) VALUES ('max', 'tokyo');
INSERT 0 1
postgres=# INSERT INTO test (name, address, college) VALUES ('john', 'rome', 'college');
INSERT 0 1
postgres=# INSERT INTO test (name, address) VALUES ('john', 'rome');
ERROR: duplicate key value violates unique constraint "test_index"
DETAIL: Key (name, address)=(john, rome) already exists.
НТН