gpt4 book ai didi

单个表上的 PostgreSQL 外键多个键

转载 作者:行者123 更新时间:2023-11-29 13:28:57 25 4
gpt4 key购买 nike

我可以想象这个问题不太可能从来没有得到回答。但是,我还没有找到它,所以无论如何这是我的问题:

我正在从 MySQL 迁移。

当我尝试创建一个包含一个数据字段的表时出现错误,其中有 2 个外键引用另一个表。

我的目标只是为员工提供一个电话簿。

目录表必须引用员工 ID 以及电话号码类型。

尝试这样做时出现此错误:

ERROR: There is no unique constraint matching given keys, for referenced table: Employees!

这是我当前的 sql 转储:

-- ----------------------------
-- Table structure for EmployeeGroups
-- ----------------------------
DROP TABLE IF EXISTS "public"."EmployeeGroups";
CREATE TABLE "public"."EmployeeGroups" (
"Id" int8 DEFAULT nextval('"EmployeeGroups_Id_seq"'::regclass) NOT NULL,
"EmployeeGroup" varchar(255) COLLATE "default"
)
WITH (OIDS=FALSE)
;

-- ----------------------------
-- Table structure for Employees
-- ----------------------------
DROP TABLE IF EXISTS "public"."Employees";
CREATE TABLE "public"."Employees" (
"Id" int8 DEFAULT nextval('"Employees_Id_seq"'::regclass) NOT NULL,
"EmployeeGroupId" int8 DEFAULT
nextval('"Employees_EmployeeGroupId_seq"'::regclass) NOT NULL,
"FirstName" varchar(255) COLLATE "default",
"LastName" varchar(255) COLLATE "default",
"CivicNumber" int4,
"CivicNumberAlias" int4,
"StreetName" varchar(255) COLLATE "default",
"City" varchar(255) COLLATE "default",
"PostalCode" varchar(255) COLLATE "default",
"UserAcessLevel" int8 DEFAULT
nextval('"Employees_UserAcessLevel_seq"'::regclass) NOT NULL,
"Username" varchar(255) COLLATE "default",
"Password" varchar(255) COLLATE "default",
"Timestamp" date
)
WITH (OIDS=FALSE)
;


-- ----------------------------
-- Table structure for PhoneNumberType
-- ----------------------------
DROP TABLE IF EXISTS "public"."PhoneNumberType";
CREATE TABLE "public"."PhoneNumberType" (
"Id" int8 DEFAULT nextval('"PhoneNumberType_Id_seq1"'::regclass) NOT NULL,
"PhoneNumberType" varchar(150) COLLATE "default" NOT NULL
)
WITH (OIDS=FALSE)
;


-- ----------------------------
-- Table structure for SystemAcessLevel
-- ----------------------------
DROP TABLE IF EXISTS "public"."SystemAcessLevel";

CREATE TABLE "public"."SystemAcessLevel" (
"Id" int8 DEFAULT nextval('"SystemAcessLevel_Id_seq"'::regclass) NOT NULL,
"AcessLevel" varchar(255) COLLATE "default" NOT NULL
)
WITH (OIDS=FALSE);

这是我的错误生成语句:

CREATE TABLE "public"."NewTable" (
"Id" serial8 NOT NULL,
"EmployeeId" int8 NOT NULL,
"PhoneNumberTypeId" int8 NOT NULL,
"PhoneNumber" varchar(16) NOT NULL,
PRIMARY KEY ("Id"),
CONSTRAINT "phone_fk_emp_id" FOREIGN KEY ("EmployeeId")
REFERENCES "public"."Employees" ("Id") ON DELETE NO ACTION ON UPDATE
CASCADE,
CONSTRAINT "phone_fk_type_id" FOREIGN KEY ("PhoneNumberTypeId")
REFERENCES "public"."PhoneNumberType" ("Id") ON DELETE NO ACTION ON
UPDATE CASCADE
)
WITH (OIDS=FALSE)
;

最佳答案

事实证明,问题在于识别 <强> EmployeeGroupId Employees 中引用的字段 表作为第二个主键 在添加 EmployeeDirectory 时产生了冲突 table 引用相同的外键作为 Employees.GroupId 的第二个主键 字段。

换句话说,似乎 PostgreSQL 将第二个主键视为创建一对一关系的唯一标识符,因此它认为将引用相同标识符的附加表与声明为第二个主键的外键相同的标识符视为错误,并且如果我错了,请纠正我,因为我不是 PostgreSQL 方面的专家。

然而,这被 Mysql 接受;这就是为什么我很难找出这个错误。

关于单个表上的 PostgreSQL 外键多个键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28191321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com