【问题标题】:Dropping unique constraint on foreign key reference of junction table删除联结表外键引用的唯一约束
【发布时间】:2021-05-07 14:16:32
【问题描述】:

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

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

CREATE TABLE "register" (
  "id" text PRIMARY KEY,
  "value" text
);

我想要的多对多关系是meter id和register 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 表中的联结表列?我知道一旦使用内部联接添加了一些数据,就可以使用单独的查询来完成,但是是否可以通过数据库表设置来完成?

【问题讨论】:

    标签: postgresql database-design


    【解决方案1】:

    是的。复合外键。

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

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

    【讨论】:

    • 谢谢!这对我有用。下次我一定要改成单引号!
    • 不!根本没有引号。单引号表示 VALUES。没有引号是标识符,但 Postgres 转换为小写(因此列名 Metermeter 是相同的,而 "Meter" 是一个标识符必须始终使用双引号。请参阅here
    • 啊,好吧,有道理。感谢您的澄清。我认为引号实际上来自 dbdocs.io 导出 SQL 函数。
    【解决方案2】:

    如果demand_data 引用meter_registers,它应该引用它的主键。所以在两列上添加一个外键约束。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-13
      • 2011-02-24
      • 1970-01-01
      • 2011-03-30
      • 1970-01-01
      • 2019-10-15
      • 2020-12-09
      相关资源
      最近更新 更多