微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

一个表是否可以引用另一个表并具有不在被引用表中的额外键值?

如何解决一个表是否可以引用另一个表并具有不在被引用表中的额外键值?

我想在两个表之间建立关系。

我有一个表 A (project),以 project_id 作为主键。
还有一个表 B (organization)。项目可以有多个组织。

问题是表 B 在 project_id 中的值不在表 A 中(但将在后面的表中)。

即使键不存在,有没有办法允许这种关系?或者我是否必须从表 B 中删除违反值的行?

解决方法

FOREIGN KEY constraint 的全部目的是禁止表 B 中违反约束的行 - 并确保它。

也就是说,您可以利用多列 FK 约束的默认 study("BNiftyLevels","BNL",overlay=true) [h,l] = security(syminfo.ticker,"D",[high,low]) plot(h,style=plot.style_stepline,color=color.red,linewidth=2) plot(l,color=color.green,linewidth=2) 行为来获得一个优雅的解决方案:如果至少有一个,则不强制执行 FK包含的列是 MATCH SIMPLE。见:

您需要一个额外的列,我的演示中的布尔标志 NULL

valid

dbfiddle here

模型已简化。实际组织将有多个项目,您将使用多对多实现。见:

CREATE TABLE project ( project_id int NOT NULL GENERATED ALWAYS AS IDENTITY,project text NOT NULL,project_id_valid boolean NOT NULL DEFAULT true -- NOT NULL!,PRIMARY KEY(project_id,project_id_valid) -- !,CONSTRAINT project_id_always_valid CHECK (project_id_valid) -- only true ); COMMENT ON COLUMN project.project_id_valid IS 'Redundant column to allow conditional multicolumn FK reference in table organization'; INSERT INTO project(project) VALUES ('project1'); CREATE TABLE organization ( org_id int GENERATED ALWAYS AS IDENTITY PRIMARY KEY,org text NOT NULL,project_id integer NOT NULL,project_id_valid boolean DEFAULT true -- can be NULL!,CONSTRAINT valid_project_fk FOREIGN KEY (project_id,project_id_valid) REFERENCES project -- !,CONSTRAINT project_id_valid_or_null CHECK (project_id_valid) -- only true ); COMMENT ON COLUMN project.project_id_valid IS 'TRUE enforces the FK constraint valid_project_fk.'; 与列上的 CONSTRAINT project_id_always_valid CHECK (valid) 结合强制 NOT NULL 始终为 project.project_id_valid,这使其成为噪声列。我们需要它用于多列 PK 以允许我们在 true 中的多列 FK 约束。 (或者,在 organization 上使用普通 PK 并在 (project_id) 上添加多列 UNIQUE 约束。)

对应的列 (project_id,project_id_valid) 可以是 organization.validtrue。如果是 NULL,则强制执行 FK 约束,否则不执行。实际上,您可以打开或关闭每行的 FK。正是您所追求的。

这些是标准 SQL 功能。不过,一定要记录下这个诡计对来世的目的。我本着这种精神在 true 列中添加了评论。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。