首页 > 解决方案 > Sql创建由其他表中的键组成的表

问题描述

这可能是一个简单的问题,但我对 SQL 和数据库还很陌生,所以我一直在关注这个网站:https ://www.postgresqltutorial.com/postgresql-foreign-key/尝试创建一个由主要组成的表其他表的键。

在这里,我在 excel 概述中有数据库的结构。用颜色显示关系。我遇到了一对多表的问题。因为每次“错误:外键约束中引用的列“id”不存在 SQL 状态:42703”时,我都会遇到相同的错误。 表结构,为关系着色

SQL查询:

DROP TABLE IF EXISTS ingredient_to_unit_relations;
DROP TABLE IF EXISTS ingrediens;


CREATE TABLE ingrediens (
  id serial,
  name_of_ingredient varchar(255),
  price_per_unit int,
  PRIMARY KEY (id)
);

CREATE TABLE ingredient_to_unit_relations (
  ingredient_relation_id int GENERATED ALWAYS AS IDENTITY,
  PRIMARY KEY (ingredient_relation_id),
    constraint Fk_ingredient_id
        FOREIGN KEY (id) 
            REFERENCES ingrediens (id)
);

标签: sqlpostgresql

解决方案


您需要定义列以将其声明为外键:

CREATE TABLE ingredient_to_unit_relations (
  ingredient_relation_id int GENERATED ALWAYS AS IDENTITY,
  ingredient_id int,
  PRIMARY KEY (ingredient_relation_id),
  constraint Fk_ingredient_id FOREIGN KEY (ingredient_id) REFERENCES ingrediens (id)
);

我可能会推荐一些不同的命名约定(我id在上表中更改了名称):

CREATE TABLE ingredients (
  ingredient_id int GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  name varchar(255),
  price_per_unit int
);

CREATE TABLE ingredient_to_unit_relations (
  ingredient_relation_id int GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  ingredient_id int,
  CONSTRAINT Fk_ingredient_id FOREIGN KEY (ingredient_id) REFERENCES ingredients (ingredient_id)
);

笔记:

  • 我喜欢在主键所在的表之后命名它们。这样,外键和主键通常具有相同的名称(using如果您愿意,可以使用)。
  • 避免SERIALGENERATED ALWAYS AS IDENTITY现在推荐。
  • 您可以内联主键约束(以及其他约束)。
  • 通常不需要在列中重复表名(除了主键)。所以,name而不是name_of_ingredient.
  • 用于货币专栏int是可疑的。它不允许更小的单位。这可能适用于某些货币,但总的来说我希望numeric/decimal类型。

推荐阅读