PostgreSQL外键在单个表上有多个键

时间:2015-01-28 11:38:13

标签: postgresql

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

我正在从MySQL迁移。

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

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

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

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

  

错误:对于引用的表:Employees!

,没有与给定键匹配的唯一约束

这是我当前的sql dump:

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

2 个答案:

答案 0 :(得分:0)

事实证明问题是确定了    的     EmployeeGroupId Employees 表中作为 第二主键 引用的字段在添加 {{1>时产生了冲突} table 引用与 EmployeeDirectory 字段的第二个主键相同的外键。

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

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

答案 1 :(得分:0)

您在外键中引用的每一列(或一组列)都必须具有主键或唯一约束。

否则,您如何确定外键指向的行?