有两个表,分别为工单和员工,员工的主键User_Id是工单的外键Creator。
可是这样设计有这样的麻烦:1.员工创建了以后就不能删除,如果删除的话,对应的工单里面就没有Creator的信息了。这个没问题。但是有的时候我在输入新员工信息的时候,提交了以后发现输错了,它也不让我删除,这样就莫名其妙多了一条没用的员工记录。2.还有就是,有个员工A,他提交工单的时候是在B部门,后来被调到C部门去了,改了数据库以后,我查B部门人员做的工单的时候就没有了这条记录。请问,我该怎么改?

解决方案 »

  1.   

    1.员工创建了以后就不能删除,如果删除的话,对应的工单里面就没有Creator的信息了。这个没问题。但是有的时候我在输入新员工信息的时候,提交了以后发现输错了,它也不让我删除,这样就莫名其妙多了一条没用的员工记录。答: 这个应该是可以删除的!2.还有就是,有个员工A,他提交工单的时候是在B部门,后来被调到C部门去了,改了数据库以后,我查B部门人员做的工单的时候就没有了这条记录。答:调到C部门,更新所有这个员工A所操作的工单!
      

  2.   

    解决办法
    问题1:
    删除员工前先删除工单里面的信息,如果不想改程序,可以将外键改为on delete cascade的形式,这样在删除员工时,其外键对应的数据会直接删除

    alter table worksheet add constraint fk_ref_user_id foreign key (user_id) references employee(user_id) con delete cascade;问题2:
    在工单表中增加一个所在部门信息字段记录员工当时所在的部门,查询时用这个部门做查询条件.
      

  3.   


    1.
    对于应用上的删除功能,通常的实现分为物理删除和逻辑删除(标记删除 delete),这两种方式各有优缺点,至于你这里提到的,提交了以后发现输错了,它也不让我删除,是有主外键这样的影响,工单没有删除当然是不能删除主表的呀。 不过这里输错了,应该提供update的功能呀。2. 
    这个问题是设计上的问题,也就是对于用户部门和工资单的关系,这里你使用的是ref的关系,而不是copy的关系,也就是你的工单里没有记录部门,部门是通过用户的信息ref的到的,所以用户的部门一改,所有的工单都到新部门了。还有一种关系是copy的关系,就是工单的表里有部门的信息,当做一个用户的工单数据时。从user的信息里拿到当时的部门,存到工单里,这样就解决你的问题了,  不过和问题1一样,ref和copy关系也各有优缺点。