背景-
一般来说,我对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)。
2条答案
按热度按时间j2cgzkjk1#
错误消息试图告诉您。外键只能引用
unique
,或primary key
. 但是你外键的目标,titles(title_id)
,不符合此要求。所以基本上你需要申报
title_id
作为titles
表以创建此外键。您还需要在列之间对齐数据类型(这是外键的另一个要求):现在,
titles(title_id)
声明为字符串,而引用列INT
. 据推测,源列应该是INT
我也是。所以:
使用此修复程序,您的整个代码在这个db fiddle中运行良好
不相关的注意:你应该避免重复引用所有的标识符;这没有帮助,以后可能会使事情变得更复杂。
ivqmmu1c2#
在table上
"titles"
你忘了定义主键。因此,不能针对该表创建外键。要解决此问题,表定义应如下所示: