Нулевое значение не уникально - PullRequest
6 голосов
/ 13 октября 2011

У меня есть такие строки на postgres:

 name | address | college 

 john | rome    |
 john | rome    |
 max  | tokyo   |

Я создаю таблицу следующим образом:

create test (
name    varchar(10),
address varchar(20),
college varchar(20),
constraint test_uq unique (name,address,college);

Как я могу сделать нулевые значения уникальными, чтобы вывод мог быть таким:

 name | address | college 

 john | rome    |
 max  | tokyo   |

Ответы [ 4 ]

2 голосов
/ 14 октября 2011

Если вам просто нужны уникальные записи в результате запроса, используйте 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.

НТН

2 голосов
/ 13 октября 2011

Документация Postgres утверждает , что это поведение соответствует стандарту SQL:

Как правило, уникальное ограничение нарушается при наличии двух или более строки в таблице, где значения всех столбцов включены в ограничение равны. Однако два нулевых значения не учитываются. равны в этом сравнении. Это означает, что даже в присутствии уникального ограничение можно хранить дубликаты строк, которые содержат нуль значение по крайней мере в одном из ограниченных столбцов. Это поведение соответствует стандарту SQL [.]

Одна возможность - переосмыслить вашу схему (если честно, ограничение уникальности для name+address+college не имеет большого смысла в вашем примере).

0 голосов
/ 13 октября 2011

NULL неизвестно, поэтому значение NULL, равное NULL, никогда не может быть истинным.Чтобы обойти этот закон, сделайте это.

Создайте новую справочную таблицу для своих колледжей.В этой таблице есть запись со значением None.Затем поместите иностранный ключ в новую справочную таблицу колледжа.

Это псевдокод, поэтому вам, возможно, придется возиться с ним, чтобы заставить его работать, но вот основная идея.

0 голосов
/ 13 октября 2011

Если вы сделаете его первичным ключом вместо уникального ограничения, оно будет работать.Для этого столбец college должен быть NOT NULL и использовать (например) пустые строки вместо значений NULL.Или вы ищете запрос?

...