使用外键的艰巨任务

时间:2012-03-19 00:16:49

标签: mysql database foreign-keys

我有两个相关的表,很常见的情况:客户端(CID,名称,姓氏)和访问(VID,VCID,dateOfVisit) - VCID是客户端ID。如果我想要数据库删除相对于某些客户端的访问记录,我删除的客户端,以及删除客户端,当我删除该客户端的最后一次访问时,如何操作外键?

2 个答案:

答案 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);                    

(也许还有更简单的东西?)。所以要么不时地运行它,要么创建一个触发器,当从访问中删除某些东西时运行它(尽管如果你要添加一个触发器,它可以使用删除信息做更聪明的事情。)

或者也许比我更有时间/精力的人可以用触发器来回答......?

(正如其他人所说,自动删除客户端是非常激烈的行为 - 这不是你通常想要在生产系统中做的事情 - 除了其他任何事情,如果客户需要更多的访问,他们会非常恼火,如果他们必须再次输入他们的详细信息......)