您好我是新手学习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)
);
答案 0 :(得分:1)
您的设计需要改进几件事。
一个表中的FOREIGN KEY指向另一个表中的PRIMARY KEY。
列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
,您只需在现有代码中列出FirstName
和LastName
,如下所示:< / 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