Ошибка SQL — нет совпадающего или уникального первичного ключа для этого списка столбцов

#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:

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

ВНЕШНИЙ КЛЮЧ в одной таблице указывает на ПЕРВИЧНЫЙ КЛЮЧ в другой таблице.

http://www.w3schools.com/sql/sql_foreignkey.asp

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.