Проблема рекурсивного внешнего ключа - PullRequest
3 голосов
/ 13 декабря 2011

В моем дизайне БД мне нужна таблица с рекурсивным отношением внешнего ключа, т.е. внешний ключ ссылается на ту же таблицу.Когда я пытаюсь сделать это с одним столбцом, он работает нормально, но когда я использую два столбца, это дает ошибку.Ниже приведен пример кода и полученная ошибка.Ваша помощь будет высоко оценена.

CREATE TABLE categories (
categoryID integer ,
parentID integer ,
setID integer REFERENCES categories(categoryID,parentID),
name char(255) NOT NULL,
PRIMARY KEY(categoryID,parentID)
);

ОШИБКА: количество ссылочных и ссылочных столбцов для внешнего ключа не совпадает

Когда я использую

setID integer REFERENCES categories(categoryID) and 
PRIMARY KEY(categoryID) 

тогда это не дает ошибки, но это не то, что я хочу.

Ответы [ 2 ]

7 голосов
/ 13 декабря 2011

Вы, вероятно, хотите это:

CREATE TABLE categories (
    categoryID integer,
    parentID integer,
    setID integer,
    name char(255) NOT NULL,
    PRIMARY KEY (categoryID, parentID),
    FOREIGN KEY (categoryID, parentID) REFERENCES categories(categoryID, parentID)
);

Обратитесь к руководству по поводу синтаксиса .

Ответ на следующий вопрос в комментарии:

CREATE TABLE categories (
    categoryID integer,
    parentID integer,
    setID integer,
    name char(255) NOT NULL,
    PRIMARY KEY (categoryID, parentID),
    UNIQUE (setID, parentID) 
    FOREIGN KEY (setID, parentID) REFERENCES categories(setID, parentID)
);

Цель внешнего ключа нуждается в каком-то ограничении уникальности. Я цитирую руководство :

Столбцы, на которые ссылаются, должны быть столбцами непереносимого уникального или ограничение первичного ключа в ссылочной таблице.

3 голосов
/ 13 декабря 2011

Да, к сожалению, вы пытаетесь сказать, что одно числовое поле должно быть эквивалентно двум числовым полям. На самом деле не произойдет.

Подумайте об использовании SetID. Вам это действительно нужно?

Вместо этого убедитесь, что parentID является внешним ключом categoryID (то есть выражает, что любое значение parentID ДОЛЖНО существовать как соответствующее и существующее значение в parentID).

...