SQL错误 - 此列列表没有匹配或唯一主键

时间:2016-10-09 16:54:53

标签: sql oracle foreign-keys ddl

您好我是新手学习SQL以及新网站!我一直在尝试使用Job属性上的外键修复这些表,并且我一直遇到此错误“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)
);

4 个答案:

答案 0 :(得分:1)

您的设计需要改进几件事。

  

一个表中的FOREIGN KEY指向另一个表中的PRIMARY KEY。

     

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

Job显然不是表Names中的主键。这就是错误的原因" SQL错误 - 此列列表没有匹配或唯一主键。"

看起来您打算从Jobs表中引用Names。意味着Names表中引用Jobs Job列的外键约束。您可以拥有多个共享相同作业的名称。

您需要稍微更改外键并将其移至Names table:

的定义
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中的Jobs,您只需在现有代码中列出FirstNameLastName,如下所示:< / p>

引用名称( FirstName LastName

作为旁注,拥有两列主键通常不是一个好主意,但是如果你有一个这样的主键,则必须引用两列主键。

答案 1 :(得分:1)

您的外键输入顺序错误。你想要:

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)
);

然后{/ 1}}需要在 Names之后定义

答案 2 :(得分:-1)

你可以尝试这个

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;

答案 3 :(得分:-1)

只有当列是主键或另一个表的主键的一部分时,才能使任何列成为外键。参考click