sql - 无法解释此错误:没有唯一约束匹配给定键的引用表
问题描述
背景 -
一般来说,我对 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_id
和emp_title_id
都包含相同的值(作为员工 ID,例如 S0002)。
解决方案
错误信息试图告诉你。外键只能引用一组列,即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 中运行良好
无关说明:您应该避免双引号所有标识符;它没有帮助,并且可能会在以后使事情变得更加复杂。
推荐阅读
- bash - 要求输入密码以查看密码文件的 Bash 脚本
- html - 如何在左侧有一个图像的重复行,在中心 html 元素的右侧有另一个图像的重复行?
- python - ValueError:发现样本数量不一致的输入变量:[1454711, 0]
- php - Netbeans 中的 PHP 项目返回 404.0 或 500.24
- azure - Azure AD 应用程序需要管理员批准错误:应用程序需要访问组织中只有管理员才能授予的资源的权限
- python - Finding the row wise mean
- c# - 如何在 C# 中格式化字符串
- list - 这是什么数据?
- swift - 如何将(hstack)多个视频与 AVMutableVideoComposition 并排组合?
- vb.net - 整数值后的尾随百分比字符