Отбрасывание уникальных ограничений - PostgreSQL - PullRequest
0 голосов
/ 10 июня 2018

TL; DR

Я ищу ясности в этом: требует ли FOREIGN KEY UNIQUE CONSTRAINT с другой стороны, в частности, в Postgres и, как правило, в отношениисистемы баз данных?

Возможно, я могу проверить это, но я спрошу, если FOREIGN KEY требует UNIQUE CONSTRAINT, что произойдет, если я его не создам?Будет ли база данных создавать одну или она выдаст ошибку?

Как я туда попал

Ранее я создавал таблицу со столбцом username, на которую наложил уникальное ограничение.Затем я создал другую таблицу со столбцом bearer_name, в котором FOREIGN KEY ссылается на столбец предыдущей таблицы username;тот, который имел UNIQUE CONSTRAINT.

Теперь я хочу удалить UNIQUE CONSTRAINT в столбце username из базы данных, потому что позже я создал UNIQUE INDEX для того же столбца и интуитивноЯ чувствую, что они служат той же цели, или нет?Но база данных жалуется, что у UNIQUE INDEX есть некоторые зависимые объекты, и поэтому его нельзя отбросить, пока я не предоставлю CASCADE в качестве опции для удаления даже зависимого объекта.Он определяет столбец FOREIGN KEY на bearer_name во второй таблице как зависимый объект.

И возможно ли для FOREIGN KEY быть точкой на UNIQUE INDEX вместо UNIQUE CONSTRAINT

1 Ответ

0 голосов
/ 10 июня 2018

Я ищу ясности в этом: требует ли ИНОСТРАННЫЙ КЛЮЧ УНИКАЛЬНОГО ОГРАНИЧЕНИЯ с другой стороны

Нет, он не требует только UNIQUE CONSTRAINT.Это может быть PRIMARY KEY или UNIQUE INDEX.

Возможно, я могу проверить это, но я спрошу, если ИНОСТРАННЫЙ КЛЮЧ требует УНИКАЛЬНОГО ОГРАНИЧЕНИЯ, что произойдет, если я не будуне создать это? Будет ли база данных создавать ее или выдает ошибку?

CREATE TABLE tab_a(a_id INT, b_id INT);
CREATE TABLE tab_b(b_id INT);

ALTER TABLE tab_a ADD CONSTRAINT fk_tab_a_tab_b FOREIGN KEY (b_id)  
             REFERENCES tab_b(b_id);
ERROR:  there is no unique constraint matching given keys 
        for referenced table "tab_b"

DBFiddle Demo

И может ли ИНОСТРАННЫЙ КЛЮЧ быть точкой УНИКАЛЬНОГО ИНДЕКСА вместо УНИКАЛЬНОГО ОГРАНИЧЕНИЯ?

Да, это возможно.

CREATE UNIQUE INDEX tab_b_i ON tab_b(b_id);

DBFiddle Demo2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...