sql - 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)
);
解决方案
您需要定义列以将其声明为外键:
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
如果您愿意,可以使用)。 - 避免
SERIAL
。GENERATED ALWAYS AS IDENTITY
现在推荐。 - 您可以内联主键约束(以及其他约束)。
- 通常不需要在列中重复表名(除了主键)。所以,
name
而不是name_of_ingredient
. - 用于货币专栏
int
是可疑的。它不允许更小的单位。这可能适用于某些货币,但总的来说我希望numeric
/decimal
类型。
推荐阅读
- amazon-web-services - 如果 Spot 实例在 AWS 中不可用,我可以获取按需 EC2 实例吗
- google-chrome - 使用 vaadin 8 被 chrome 版本 76.* 及更高版本阻止下载
- mysql - order by WHERE LIKE returned result
- firebase - 使用 Cloud Storage 触发器时可以使用变量吗?
- node.js - 使用 Mongoose 创建文档时如何设置索引
- javascript - 用 Javascript 格式化糟糕的字符串
- api - Gmail API:在回复中包含以前的邮件
- python - 如何在一行python烧瓶中写入所有request.form []数据
- ios - Xcode 11 调试器非常慢 - 一个已知问题?
- google-cloud-platform - 无法直接从浏览器访问启用 Istio 的 GKE 服务,只能通过 curl