[英]Retrieve all records from one table even if a related record can't be found in a related table
[英]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个表中插入数据的过程,并防止每个人直接将数据插入表中(仅通过此过程)
这里有两个不同的问题。
对于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”中添加行,但您必须编写过程代码来执行此操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.