【问题标题】:SQL error- No matching or unique primary key for this column listSQL 错误 - 此列列表没有匹配或唯一的主键
【发布时间】:2016-10-09 16:54:53
【问题描述】:

您好,我是学习 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)
);

【问题讨论】:

  • 翻转约束使名称依赖于作业。
  • 希望没有名为 John Smith 的第二名员工。
  • 不确定反复试验 + SO 是最好的学习方式。

标签: sql oracle foreign-keys ddl


【解决方案1】:

您的设计需要改进的地方很少。

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

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

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

看起来您打算从 Names 表中引用 Jobs。这意味着Names 表中存在外键约束,引用JobsJob 列。您可以有多个名称共享同一个作业。

您需要稍微更改外键并将其移至您对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)
);

如果您真的需要从Jobs 引用Names,您只需在现有代码中列出FirstNameLastName,如下所示:

参考名称(FirstNameLastName


附带说明,拥有两列主键通常不是一个好主意,但如果您有这样的主键,则必须将其引用为两列主键。

【讨论】:

    【解决方案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】:

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

        【讨论】:

        • 您的回答存在细微的错误,当问题是针对 Oracle 时,您正在链接到 MySQL 资源。
        猜你喜欢
        • 2022-01-10
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-15
        • 2014-05-15
        相关资源
        最近更新 更多