正在删除连接表的外键引用上的唯一约束



我正在PostgreSQL中创建一个数据库,并希望在表之间包含多对多关系。我想包括的两个表格如下:

CREATE TABLE "meter" (
"id" integer PRIMARY KEY,
"nmi" integer,
"next_scheduled_read_date" timestamp
);
CREATE TABLE "register" (
"id" text PRIMARY KEY,
"value" text
);

我想要的多对多关系是仪表id和寄存器id之间的关系。然后我创建了下面的连接表:

CREATE TABLE "meter_registers" (
"meter_id" integer NOT NULL,
"register_id" text NOT NULL,
PRIMARY KEY ("meter_id", "register_id"),
FOREIGN KEY ("meter_id") REFERENCES "meter" ("id") ON UPDATE CASCADE,
FOREIGN KEY ("register_id") REFERENCES "register" ("id") ON UPDATE CASCADE
);

然后,我想创建一个表,引用上面的连接表中的meter_id和register_id值,其结构如下:

CREATE TABLE "demand_data" (
"upload_id" integer PRIMARY KEY,
"nmi" integer,
"meter" integer,
"register" text,
"start" timestamp,
"end" timestamp,
"duration" Time,
"demand" double precision
);

其中仪表和寄存器参考相应的接线表列。然而,由于连接表的值不是唯一的,我不能简单地为仪表和寄存器列添加外键,所以当我运行以下内容时会遇到错误:

ALTER TABLE "demand_data" ADD FOREIGN KEY ("meter") REFERENCES "meter_registers" ("meter_id");
ALTER TABLE "demand_data" ADD FOREIGN KEY ("register") REFERENCES "meter_registers" ("register_id");
ERROR:  there is no unique constraint matching given keys for referenced table "meter_registers"

有没有一种方法可以在没有外键约束的情况下引用demand_data表中的连接表列?我知道,一旦使用内部联接添加了一些数据,就可以使用单独的查询,但是,是否可以通过数据库表设置来完成?

是。复合外键。

ALTER TABLE "demand_data" 
ADD FOREIGN KEY ("meter","register") 
REFERENCES "meter_registers"( "meter_id", "register_id");

注意:没有直接关系,你应该避免那些可怕的双引号。

如果demand_data引用meter_registers,则应引用其主键。因此,在两列上都添加一个外键约束。

如果您想要两个独立的外键,您可能应该直接引用meterregister

最新更新