Unable to explain this error: there is no unique constraint matching given keys for referenced table
Unable to explain this error: there is no unique constraint matching given keys for referenced table
背景 -
一般来说,我对 Postgres 和 SQL 非常陌生。我正在完成一项家庭作业任务,我们必须在将 ERD 导出为 SQL 和运行宁在 Postgres 中。
我的SQL脚本-
-- 员工头衔 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");
"I get the error message ERROR:there is no unique constraint matching given keys for referenced table "标题" SQL 状态:42830"
我的想法-
...可能是标题 table (title_id
) 中的外键与员工 table (emp_title_id
) 中的主键之间的名称不匹配导致了这个问题。 title_id
和 emp_title_id
都包含相同的值(即员工 ID,例如 S0002)。
错误信息试图告诉你。外键只能引用一组 unique
或 primary key
的列。但是你的外键目标titles(title_id)
不满足这个要求。
所以基本上你需要在 titles
table 中声明 title_id
为主键才能创建这个外键。
您还需要对齐列之间的数据类型(这是外键的另一个要求):截至目前,titles(title_id)
被声明为字符串,而引用列是 INT
。据推测,源列也应该是 INT
。
所以:
CREATE TABLE titles (
title_id int NOT NULL,
title VARCHAR NOT NULL,
CONSTRAINT pk_titles PRIMARY KEY (title_id)
);
通过此修复,您的整个代码运行良好 in this DB Fiddle
无关说明:你应该避免双引号所有的标识符;这无济于事,以后可能会使事情变得更复杂。
在table中"titles"
你忘了定义主键。因此,您不能针对此 table.
创建外键
要解决此问题,table 定义应如下所示:
CREATE TABLE "titles" (
"title_id" VARCHAR NOT NULL,
"title" VARCHAR NOT NULL,
CONSTRAINT "pk_titles" PRIMARY KEY (
"title_id"
)
);
背景 -
一般来说,我对 Postgres 和 SQL 非常陌生。我正在完成一项家庭作业任务,我们必须在将 ERD 导出为 SQL 和运行宁在 Postgres 中。
我的SQL脚本-
-- 员工头衔 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");
"I get the error message ERROR:there is no unique constraint matching given keys for referenced table "标题" SQL 状态:42830"
我的想法-
...可能是标题 table (title_id
) 中的外键与员工 table (emp_title_id
) 中的主键之间的名称不匹配导致了这个问题。 title_id
和 emp_title_id
都包含相同的值(即员工 ID,例如 S0002)。
错误信息试图告诉你。外键只能引用一组 unique
或 primary key
的列。但是你的外键目标titles(title_id)
不满足这个要求。
所以基本上你需要在 titles
table 中声明 title_id
为主键才能创建这个外键。
您还需要对齐列之间的数据类型(这是外键的另一个要求):截至目前,titles(title_id)
被声明为字符串,而引用列是 INT
。据推测,源列也应该是 INT
。
所以:
CREATE TABLE titles (
title_id int NOT NULL,
title VARCHAR NOT NULL,
CONSTRAINT pk_titles PRIMARY KEY (title_id)
);
通过此修复,您的整个代码运行良好 in this DB Fiddle
无关说明:你应该避免双引号所有的标识符;这无济于事,以后可能会使事情变得更复杂。
在table中"titles"
你忘了定义主键。因此,您不能针对此 table.
要解决此问题,table 定义应如下所示:
CREATE TABLE "titles" (
"title_id" VARCHAR NOT NULL,
"title" VARCHAR NOT NULL,
CONSTRAINT "pk_titles" PRIMARY KEY (
"title_id"
)
);