2012-03-19 48 views
0

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

+1

*'...删除客户端,当我删除最后一次访问该客户端时留下'* - 以及如果您在记录某些有史以来第一次访问时犯了错误怎么办最近添加的客户端,删除它再次重新进入, - 哎呀! - “客户在哪里?!” – 2012-03-19 00:40:41

回答

1

我建议你做一个软删除,所以你可以保留你的访问记录。

软删除意味着您只需添加一个额外的字段is_active默认为true,并且当您删除记录时将其翻转为false。

1

通过使用“删除级联”,您可以自动删除已删除客户端的访问。例如:

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

(也许还有更简单的东西?)。所以或者不时运行它,或者创建一个触发器,以便在从访问中删除某些内容时运行它(尽管如果要添加触发器,它可以使用删除信息来更智能地执行某些操作)。

或者比我有更多时间/精力的人可以用触发器写出答案......? (正如其他人所说的那样,自动删除客户端是非常激烈的行为 - 这不是你通常想要在生产系统中执行的事情 - 除了其他任何事情,如果客户需要更多的访问,他们会非常恼火如果他们必须再次输入他们的详细信息...)