繁体   English   中英

创建具有引用另一个表的外键的表

[英]creating table having foreign key that reference another table

我正在使用 PGAdminIII 数据库。

我有一个名为STOCKREGISTER的表,其中包含由三个字段组成的复合主键,即stockregisterId、applicationId 和 date

我必须创建另一个表STOCK ,它有一个引用 STOCKREGISTER 的字段stockregisterId外键字段。如果我正在尝试创建STOCK表,则会显示一条错误消息。错误消息是“没有唯一的约束匹配键引用表STOCKREGISTER”。下一步我必须采取什么

第一张桌子

CREATE TABLE stock_register
(
  stock_register_id bigint NOT NULL,
  application_id bigserial NOT NULL,
  production_date date NOT NULL,
  opening_bal bigint DEFAULT 0,
  quantity_produced bigint,
  total_quantity bigint 
  CONSTRAINT primarykey PRIMARY KEY (stock_register_id, application_id, production_date),
  CONSTRAINT "foreignKey" FOREIGN KEY (application_id)
      REFERENCES application (application_id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)

下面是第二张表。这里我不能将stock_register_id作为外键

    CREATE TABLE Stock
(
  stock_id bigint NOT NULL,
  stock_register_id bigint,
  dimension bigserial NOT NULL,
  CONSTRAINT "stockid" PRIMARY KEY (stock_id)
)

我想语法应该是:

CREATE TABLE Stock
(
  stock_id bigint NOT NULL,
  stock_register_id bigint,
  dimension bigserial NOT NULL,
  CONSTRAINT "stockid"
    FOREIGN KEY (stock_id)
    REFERENCES stock_register (stock_register_id) 
)
CREATE TABLE Stock
(
stock_id bigint NOT NULL,
stock_register_id bigint,
dimension bigserial NOT NULL,
CONSTRAINT primaryKey PRIMARY KEY (stock_id),
CONSTRAINT foreignKey FOREIGN KEY(stock_register_id)
REFERENCES stock_register (stock_register_id)
)

那应该是你需要的一切。 在使用外键时,您还必须确保数据库表引擎、排序规则和字符集匹配。

对于唯一约束问题,似乎没有要与你的问题stock_register_id在PK stock_register表。 基于错误消息,我怀疑这是没有找到表名STOCKREGISTER stock_register在你的第二个创建语句。

什么是外键? 指向另一个表中特定记录的指针。

如何根据您的 DDL 识别 stock_register 中的特定记录? 通过 (stock_register_id, application_id, production_date) 的唯一组合。

因此,只要 application_id 和 production_date 不同,stock_register_id = 1 就可以出现在一千个不同的记录中。

因此,如果您只有一个 stock_register_id,则无法知道它指向哪个 stock_register 记录,因此 DBMS 无法强制执行外键。

您必须将 application_id 和 production_date 添加到 stock 表,并使所有三列一起成为 stock_register 上复合键的 FK,或者您必须从 stock_register 上的 PK 中删除 application_id 和 production_date,以便 FK 和 PK 列匹配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM