#sql #oracle #foreign-keys #ddl
#sql #Oracle #внешние ключи #ddl
Вопрос:
Привет, я новичок в изучении SQL, а также новичок на сайте! Я пытался исправить эти таблицы вместе с помощью внешнего ключа в атрибуте задания, и я продолжаю сталкиваться с этой ошибкой «Ошибка SQL — нет совпадающего или уникального первичного ключа для этого списка столбцов».
Из того, что я понимаю и смог выяснить методом проб и ошибок, проблема связана именно с моим ограничением внешнего ключа, но, похоже, я не могу понять, как это исправить.
Любая помощь будет оценена.
Create Table Names
(
FirstName VARCHAR2(25),
LastName VARCHAR2(25),
Address VARCHAR2(25),
Job VARCHAR2(25),
Constraint Name_PK
Primary Key (FirstName, LastName)
);
Create Table Jobs
(
Job VARCHAR2(25),
Salary VARCHAR2(5),
Assistant VARCHAR2(5),
Constraint Jobs_PK
Primary Key (Job),
Constraint Jobs_FK
Foreign Key (Job)
References Names(Job)
);
Комментарии:
1. Переверните ограничение, чтобы имена зависели от заданий.
2. Надеюсь, нет второго сотрудника по имени Джон Смит .
3. Не уверен, что метод проб и ошибок SO — лучший способ обучения.
Ответ №1:
Есть несколько вещей, которые вам нужно улучшить с помощью вашего дизайна.
ВНЕШНИЙ КЛЮЧ в одной таблице указывает на ПЕРВИЧНЫЙ КЛЮЧ в другой таблице.
Job
Очевидно , что столбец не является первичным ключом в таблице Names
. Это является причиной ошибки «Ошибка SQL — нет совпадающего или уникального первичного ключа для этого списка столбцов».
Похоже, вместо этого вы собираетесь ссылаться Jobs
на Names
таблицу. Это означает, что существует ограничение внешнего ключа в Names
таблице, ссылающейся Jobs
на Job
столбец. У вас может быть несколько имен, которые используют одно и то же задание.
Вам нужно будет немного изменить внешний ключ и переместить его в ваше определение Names
таблицы:
Create Table Jobs
(
Job VARCHAR2(25),
Salary VARCHAR2(5),
Assistant VARCHAR2(5),
Constraint Jobs_PK
Primary Key (Job)
);
Create Table Names
(
FirstName VARCHAR2(25),
LastName VARCHAR2(25),
Address VARCHAR2(25),
Job VARCHAR2(25),
Constraint Name_PK
Primary Key (FirstName, LastName),
Constraint Jobs_FK
Foreign Key (Job)
References Jobs(Job)
);
Если вам действительно нужно ссылаться Names
на from Jobs
, все, что вам нужно сделать, это перечислить FirstName
и LastName
в вашем существующем коде, как показано ниже:
Ссылается на имена (имя, фамилия)
В качестве примечания, обычно не рекомендуется иметь первичный ключ с двумя столбцами, но если у вас есть такой, вам придется ссылаться на первичный ключ с двумя столбцами.
Ответ №2:
У вас есть внешние ключи в неправильном порядке. Вы хотите:
Create Table Names (
FirstName VARCHAR2(25),
LastName VARCHAR2(25),
Address VARCHAR2(25),
Job VARCHAR2(25),
Constraint pk_Names Primary Key (FirstName, LastName)
Constraint fk_Names_Job Foreign Key (Job) References Jobs(Job)
);
А затем Names
необходимо определить после Jobs
.
Ответ №3:
Вы могли бы попробовать это
CREATE TABLE `NAMES` (
`FirstName` varchar(25) DEFAULT NULL,
`LastName` varchar(25) DEFAULT NULL,
`Address` varchar(25) DEFAULT NULL,
`Job` varchar(25) DEFAULT NULL,
KEY `Job` (`Job`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `Jobs` (
`Job` varchar(25) DEFAULT NULL,
`Salary` varchar(5) DEFAULT NULL,
`Assistant` varchar(5) DEFAULT NULL,
KEY `Job` (`Job`),
CONSTRAINT `Jobs_ibfk_1` FOREIGN KEY (`Job`) REFERENCES `NAMES` (`Job`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Ответ №4:
вы можете сделать любой столбец внешним ключом, только если столбец является первичным ключом или частью первичного ключа другой таблицы. Щелчок по ссылке
Комментарии:
1. В вашем ответе есть незначительные неточности, и вы ссылаетесь на ресурс MySQL, когда вопрос касается Oracle.