Мне нужна помощь, я пытаюсь создать рекурсивное отношение, используя приведенный ниже код, но продолжаю получать сообщение об ошибке
CREATE TABLE `Employee` (
`SSN` int,
`address` varchar(50),
`salary` varchar(50),
`sex` varchar(50),
`birthDate` varchar(50),
`dependantId` int,
`supervisorId` int,
PRIMARY KEY (`SSN`),
FOREIGN KEY (`dependantId`) REFERENCES `Dependant`(`dependantId`),
FOREIGN KEY (`supervisorId`) REFERENCES `Employee`(`supervisorId`)
);
Это ошибка, которую я получаю:
#1005 - Невозможно создать таблицу company recursive
.employee
(ошибка: 150 "Ограничение внешнего ключа сформировано неправильно")
Таблице нужен столбец ID
, чтобы на него можно было ссылаться с помощью ограничений внешнего ключа. Эта колонка должна быть UNIQUE
, а в идеале NOT NULL
. Типичное решение будет выглядеть так:
CREATE TABLE Employee (
`SSN` int,
`address` varchar(50),
`salary` varchar(50),
`sex` varchar(50),
`birthDate` varchar(50),
id int not null unique, -- non nullable unique (acts as a key)
dependantId int, -- nullable reference
supervisorId int, -- nullable reference
PRIMARY KEY (`SSN`),
FOREIGN KEY (dependantId) REFERENCES Employee (id),
FOREIGN KEY (supervisorId) REFERENCES Employee (id)
);
В этом случае dependantId
и supervisorId
могут быть нулевыми и стать ссылками, указывающими на одну и ту же таблицу Employee
.
В качестве примечания: обычно иерархии включают ссылки только на руководителя, а не на зависимого. В вашем случае последний несколько избыточен и не будет работать, если у руководителя более одного иждивенца.
ссылка должна идти на SSN, так как это первичный ключ
Таким образом, вы получите
CREATE TABLE `Employee` ( `SSN` int, `address` varchar(50), `salary` varchar(50), `sex` varchar(50), `birthDate` varchar(50), `dependantId` int, `supervisorId` int, PRIMARY KEY (`SSN`), FOREIGN KEY (`dependantId`) REFERENCES `Employee`(`SSN`), FOREIGN KEY (`supervisorId`) REFERENCES `Employee`(`SSN`) );
INSERT INTO Employee VALUES (1,'adreess1','10', 'male', '2000-01-01',NULL,NULL)
INSERT INTO Employee VALUES (2,'adreess1','10', 'male', '2000-01-01',NULL,1)
INSERT INTO Employee VALUES (3,'adreess1','10', 'male', '2000-01-01',2,1)
SELECT * FROM Employee
SSN | address | salary | sex | birthDate | dependantId | supervisorId --: | :------- | :----- | :--- | :--------- | ----------: | -----------: 1 | adreess1 | 10 | male | 2000-01-01 | null | null 2 | adreess1 | 10 | male | 2000-01-01 | null | 1 3 | adreess1 | 10 | male | 2000-01-01 | 2 | 1
дб <> рабочий пример здесь
Ссылочный столбец, такой как
Dependant (dependantId)
, должен быть «ключом». Вероятно, вам нужно определить столбецID
, на который будут ссылаться эти два FK.