首页 > 解决方案 > 无法解释此错误:没有唯一约束匹配给定键的引用表

问题描述

背景 -
一般来说,我对 Postgres 和 SQL 非常陌生。我正在完成一项家庭作业,在将 ERD 导出为 SQL 并在 Postgres 中运行之前,我们必须获取 6 个包含数据的 .csv 文件并将它们概念化为 ERD 形式的表。

我的 SQL 脚本 -
-- Staff Title Table

CREATE TABLE "titles" (
    "title_id" VARCHAR   NOT NULL,
    "title" VARCHAR   NOT NULL
);

-- Employees Table
CREATE TABLE "employees" (
    "emp_no" INT   NOT NULL,
    "emp_title_id" INT   NOT NULL,
    "birth_date" DATE   NOT NULL,
    "first_name" VARCHAR   NOT NULL,
    "last_name" VARCHAR   NOT NULL,
    "sex" INT   NOT NULL,
    "hire_date" DATE   NOT NULL,
    CONSTRAINT "pk_employees" PRIMARY KEY (
        "emp_no"
     )
);

-- Salaries Table
CREATE TABLE "salaries" (
    "emp_no" INT   NOT NULL,
    "salary" INT   NOT NULL
);

-- Department Manager
CREATE TABLE "dept_manager" (
    "dept_no" VARCHAR   NOT NULL,
    "emp_no" INT   NOT NULL
);

-- Department Numbers
CREATE TABLE "departments" (
    "dept_no" VARCHAR   NOT NULL,
    "dept_name" VARCHAR   NOT NULL,
    CONSTRAINT "pk_departments" PRIMARY KEY (
        "dept_no"
     )
);

-- Employee vs. Department
CREATE TABLE "dept_emp" (
    "emp_no" INT   NOT NULL,
    "dept_no" VARCHAR   NOT NULL
);

ALTER TABLE "employees" ADD CONSTRAINT "fk_employees_emp_title_id" FOREIGN KEY("emp_title_id")
REFERENCES "titles" ("title_id");

ALTER TABLE "salaries" ADD CONSTRAINT "fk_salaries_emp_no" FOREIGN KEY("emp_no")
REFERENCES "employees" ("emp_no");

ALTER TABLE "dept_manager" ADD CONSTRAINT "fk_dept_manager_dept_no" FOREIGN KEY("dept_no")
REFERENCES "departments" ("dept_no");

ALTER TABLE "dept_manager" ADD CONSTRAINT "fk_dept_manager_emp_no" FOREIGN KEY("emp_no")
REFERENCES "employees" ("emp_no");

ALTER TABLE "dept_emp" ADD CONSTRAINT "fk_dept_emp_emp_no" FOREIGN KEY("emp_no")
REFERENCES "employees" ("emp_no");

ALTER TABLE "dept_emp" ADD CONSTRAINT "fk_dept_emp_dept_no" FOREIGN KEY("dept_no")
REFERENCES "departments" ("dept_no");

问题
我很好地导出了 SQL 脚本,但是当我运行时

ALTER TABLE "employees" ADD CONSTRAINT "fk_employees_emp_title_id" FOREIGN KEY("emp_title_id")
REFERENCES "titles" ("title_id");

“我收到错误消息错误:没有唯一约束匹配引用表“标题”SQL 状态的给定键:42830”

我的想法 -
......可能是titles表(title_id)中的外键和它在employees表(emp_title_id)中的主键之间的名称不匹配导致了这个问题。两者title_idemp_title_id都包含相同的值(作为员工 ID,例如 S0002)。

标签: sqlpostgresqlforeign-keyscreate-table

解决方案


错误信息试图告诉你。外键只能引用一组列,即unique、 或primary key。但是您的外键的目标titles(title_id), 无法满足此要求。

所以基本上你需要title_id在表中声明为主键titles才能创建这个外键。

您还需要对齐列之间的数据类型(这是外键的另一个要求):截至目前,titles(title_id)被声明为字符串,而引用列是INT. 据推测,源列应该INT也是。

所以:

CREATE TABLE titles (
    title_id int   NOT NULL,
    title VARCHAR   NOT NULL,
    CONSTRAINT pk_titles PRIMARY KEY (title_id)
);

通过此修复,您的整个代码在此 DB Fiddle 中运行良好

无关说明:您应该避免双引号所有标识符;它没有帮助,并且可能会在以后使事情变得更加复杂。


推荐阅读