Ссылка внешнего ключа на первичный ключ из двух столбцов - PullRequest
5 голосов
/ 19 марта 2010

Я создаю базу данных, которая должна работать на MySQL, PostgreSQL и SQLite. Одна из моих таблиц имеет первичный ключ из двух столбцов:

CREATE TABLE tournament (
    state CHAR(2) NOT NULL, 
    year INT NOT NULL,
    etc..., 
    PRIMARY KEY(state, year)
);

Я хочу ссылку на таблицу tournament из другой таблицы, но Я хочу, чтобы эта ссылка была nullable . Вот как я могу это сделать, представив, что у победителя не обязательно будет турнир:

CREATE TABLE winner (
    name VARCHAR NOT NULL,
    state CHAR(2) NULL,
    year INT NULL
);

Если state равно нулю, но year нет, или наоборот, таблица будет несовместимой. Я считаю, что следующее FOREIGN KEY ограничение исправляет это:

ALTER TABLE winner ADD CONSTRAINT FOREIGN KEY fk (name, state) REFERENCES tournament (name, state);

Это правильный способ обеспечения согласованности? Правильно ли нормализована эта схема?

1 Ответ

4 голосов
/ 19 марта 2010

Правило № 1: ВСЕГДА СКАЖИТЕ БАЗУ ДАННЫХ, ВЫ ИСПОЛЬЗУЕТЕ

Хорошо, я собираюсь предложить вам взглянуть на предложение ON DELETE и предложение MATCH. Поскольку Pg достаточно совместим с SQL, я укажу вам текущие документы по CREATE TABLE.

Выдержка:

В этих пунктах указан внешний ключ ограничение, которое требует, чтобы группа из одного или нескольких столбцов новая таблица должна содержать только значения которые соответствуют значениям в ссылках столбец (ы) некоторого ряда ссылочная таблица. Если refcolumn опущен, первичный ключ reftable используется. Ссылка столбцы должны быть столбцами ограничение уникального или первичного ключа в ссылочная таблица. Обратите внимание, что ограничения внешнего ключа не могут быть определяется между временными таблицами и постоянные столы.

значение, вставленное в ссылку столбцы сопоставляются с Значения ссылочной таблицы и ссылочные столбцы с использованием данного тип соответствия. Есть три матча типы: MATCH FULL, MATCH PARTIAL и МАТЧ ПРОСТО, который также является дефолт. МАТЧ ПОЛНЫЙ не позволит один столбец многоколоночного внешнего ключа быть нулевым, если не все столбцы внешнего ключа являются нулевыми МАТЧ ПРОСТО позволяет некоторые столбцы внешнего ключа будут нулевыми другие части внешнего ключа не являются ноль. MATCH PARTIAL еще нет реализован.

Кроме того, когда данные в указанные столбцы изменены, определенные действия выполняются с данными в столбцы этой таблицы. НА УДАЛЕНИИ предложение определяет действие для выполнения когда указанная строка в ссылочная таблица удаляется. Аналогично, предложение ON UPDATE определяет действие, которое нужно выполнить, когда ссылочная колонка в ссылочной таблица обновляется до нового значения. Если строка обновлена, но указанный столбец на самом деле не изменилось, никаких действий не сделано. Ссылочные действия, кроме НЕТ Проверка ACTION не может быть отложена, даже если ограничение объявлено откладываемые. Есть следующие Возможные действия для каждого предложения:

Кроме того, здесь есть серьезное исключение для MS SQL, которое не допускает поведения частичных совпадений (MATCH SIMPLE и MATCH PARTIAL) во внешних ключах (по умолчанию и принудительно выполняет MATCH FULL). Существуют обходные пути, в которых вы создаете индекс MATCH FULL для той части таблицы, которая не равна NULL для любой составляющей составного ключа.

...