Не удается создать рекурсивную связь в MySQL

Мне нужна помощь, я пытаюсь создать рекурсивное отношение, используя приведенный ниже код, но продолжаю получать сообщение об ошибке

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 "Ограничение внешнего ключа сформировано неправильно")

Ссылочный столбец, такой как Dependant (dependantId), должен быть «ключом». Вероятно, вам нужно определить столбец ID, на который будут ссылаться эти два FK.

The Impaler 10.04.2022 14:35
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
1
34
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Таблице нужен столбец 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

дб <> рабочий пример здесь

Другие вопросы по теме