Уникальное ограничение для нескольких таблиц - PullRequest
8 голосов
/ 08 июня 2011

Допустим, у нас есть эти таблицы:

CREATE TABLE A (
    id SERIAL NOT NULL PRIMARY KEY
);
CREATE TABLE B (
    id SERIAL NOT NULL PRIMARY KEY
);
CREATE TABLE Parent (
    id SERIAL NOT NULL PRIMARY KEY,
    aId INTEGER NOT NULL REFERENCES A (id),
    bId INTEGER NOT NULL REFERENCES B (id),
    UNIQUE(aId, bId)
);
CREATE TABLE Child (
    parentId INTEGER NOT NULL REFERENCES Parent (id),
    createdOn TIMESTAMP NOT NULL
);

Можно ли создать уникальное ограничение для Child, чтобы для всех строк в Child не более одной ссылки на Parent имел значение aId? Другими словами, могу ли я создать уникальное ограничение, чтобы в объединении вышеприведенных таблиц не было дубликатов aId? Я думаю, что нет - грамматика каждой базы данных, которую я могу найти, кажется, привязана к одной таблице на ограничение - но это может быть недостатком воображения с моей стороны. (Отмена нормализации для включения aId в Child, конечно, является одним из решений.)

Ответы [ 2 ]

4 голосов
/ 08 июня 2011

Вы можете попробовать следующее.Вы должны создать избыточное ограничение UNIQUE для (id, aId) в Parent (SQL довольно глуп, не так ли?в целом, вместо этого добавьте bId и просто обратитесь к родительской таблице на основе (aId, bId):

CREATE TABLE Child
(aId INTEGER NOT NULL UNIQUE,
 bId INTEGER NOT NULL,
FOREIGN KEY (aId,bId) REFERENCES Parent (aId,bId),
createdOn TIMESTAMP NOT NULL);

. Есть ли причины, по которым вы не можете этого сделать?

1 голос
/ 09 июня 2011

Правильный способ сделать это - полностью исключить таблицу Child и поместить столбец createdOn в таблицу Parent без ограничения NOT NULL.Все, что вы говорите, это то, что одна запись Parent может иметь ноль или одно (но не более) createdOn значений.Вам не нужна отдельная таблица для этого.Тот факт, что это нелегко или очевидно сделать иначе, частично подтверждает мою точку зрения.;-) SQL обычно работает таким образом.

...