无法解释此错误:没有与引用表的给定键匹配的唯一约束

euoag5mw  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(294)

背景-
一般来说,我对postgres和sql非常陌生。我正在完成一项家庭作业,在将erd导出为sql并在postgres中运行之前,我们必须将包含数据和概念的6x.csv文件以erd的形式作为表。
我的sql脚本-
--员工职称表

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

“我收到错误信息error:there is 对于引用的表“titles”sql state:42830,没有与给定键匹配的唯一约束
我的想法-
…这可能是titles表中外键之间的名称不匹配吗( title_id )它是employees表中的主键( emp_title_id )导致了这个问题。两者 title_id 以及 emp_title_id 包含相同的值(即雇员id,例如s0002)。

j2cgzkjk

j2cgzkjk1#

错误消息试图告诉您。外键只能引用 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中运行良好
不相关的注意:你应该避免重复引用所有的标识符;这没有帮助,以后可能会使事情变得更复杂。

ivqmmu1c

ivqmmu1c2#

在table上 "titles" 你忘了定义主键。因此,不能针对该表创建外键。
要解决此问题,表定义应如下所示:

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

相关问题