我有两个相关的表,很常见的情况:客户端(CID,名称,姓氏)和访问(VID,VCID,dateOfVisit) - VCID是客户端ID。如果我想要数据库删除相对于某些客户端的访问记录,我删除的客户端,以及删除客户端,当我删除该客户端的最后一次访问时,如何操作外键?
答案 0 :(得分:1)
我建议您进行软删除,这样您就可以保留您的访问记录。
软删除意味着您只需添加一个额外的字段is_active
将其默认为true,并在删除记录时将其翻转为false。
答案 1 :(得分:1)
您可以使用“on delete cascade”自动删除已删除客户端的访问。类似的东西:
create table clients (id integer primary key);
create table visits (id integer primary key,
client integer,
foreign key (client) references clients(id)
on delete cascade);
但另一种方式(自动删除没有访问的客户)更难。
您可以通过执行以下操作手动删除没有访问权限的客户:
delete from clients where id in
(select cid from
(select clients.id as cid, visits.id as vid
from clients left join visits on (clients.id = visits.client))
where vid is null);
(也许还有更简单的东西?)。所以要么不时地运行它,要么创建一个触发器,当从访问中删除某些东西时运行它(尽管如果你要添加一个触发器,它可以使用删除信息做更聪明的事情。)
或者也许比我更有时间/精力的人可以用触发器来回答......?
(正如其他人所说,自动删除客户端是非常激烈的行为 - 这不是你通常想要在生产系统中做的事情 - 除了其他任何事情,如果客户需要更多的访问,他们会非常恼火,如果他们必须再次输入他们的详细信息......)