繁体   English   中英

对于表中的所有记录,如何保证外键相关表上至少有一条记录?

[英]For all records in a table how to guarantee at least one record on a foreign key related table?

假设数据库中有两个表。 第一个是X,第二个是Y.Y表在X表上有一个外键。 因此,如果Y表上有记录,则X表上必须存在与foreignkey相关的列值。 这是默认行为。

   X         Y
-------   -------
  ID        ID
            XID <--- Foreignkey to X table.

现在,对于X表中的所有记录,我想保证Y表上必须至少有一条记录。 如果没有,则应自动添加一个。 我怎样才能做到这一点?

要将错过的记录插入到现有数据的Y ,您可以运行类似的内容

INSERT INTO Y(xid)
SELECT x.id 
FROM x 
WHERE NOT EXISTS(SELECT NULL FROM Y a WHERE a.xid = x.id);

为了防止将来出现这种情况,请编写一个在2个表中插入数据的过程,并防止每个人直接将数据插入表中(仅通过此过程)

这里有两个不同的问题。

  1. 管理声明性约束。
  2. 管理插入,更新和删除。

对于x中的每一行,y中存在保证行的“正常”方式是在两个表中包括外键。 每个表引用另一个。

create table x (
  x_id integer primary key,
  y_id integer not null
);

create table y (
  y_id integer primary key,
  x_id integer not null references x (x_id)
);

alter table x
add constraint one_to_one
foreign key (y_id)
  references y (y_id) deferrable initially deferred;

begin transaction;
insert into x values (1, 100);
insert into y values (100, 1);
commit;

虽然这可以保证每个“x”都有一个“y”,但可以说,并不能保证每个“x”都有不同的 “y”,或者每个“x”都有自己的“y”。 我不确定这是否是你的要求。

这是不太你在找什么,因为你有一个1:你的两个表之间N的关系。 你可以让它工作,但我认为你必须编写一个触发器来管理对表“y”的更改。 例如,如果用户从“y”中删除“x”包含外键引用的行,则需要更新“x”以引用“y”中的不同行。

但这导致了第二个问题:管理插入,更新和删除。 有几种方法可以做到这一点。

  • 客户端负责提供保持数据库一致所需的所有语句。 (可能除了上面的外键问题,最好在“y”的触发器中处理。)
  • 客户端无法直接访问基表。 所有更改都通过存储过程完成。
  • 客户端无法直接访问基表。 所有更改都通过可更新视图进行。

存储过程和可更新视图可以为您提供一定程度的自动在“y”中添加行,但您必须编写过程代码来执行此操作。

暂无
暂无

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

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