mySQL中对子表的约束

mySQL中对子表的约束,mysql,sql,database,database-design,sql-update,Mysql,Sql,Database,Database Design,Sql Update,我有这样的情况: MANAGER (ManagerID, Salary, .... , email) PROJECT (ProjectID, ..., Date) 由于经理和项目之间存在关系M:N,因此我将有第三个表: Manager_has_Project( ManagerID, ProjectID ) 其中(ManagerID,projectd)是管理者项目的复合主键 假设我们必须删除一位从数据库中创建了一些项目的经理:SQL不会让我们这样做。我们可以在子表“on DELETE C

我有这样的情况:

MANAGER (ManagerID, Salary, .... , email)

PROJECT (ProjectID, ..., Date) 
由于经理和项目之间存在关系M:N,因此我将有第三个表:

Manager_has_Project( ManagerID, ProjectID ) 
其中(ManagerID,projectd)管理者项目的复合主键

假设我们必须删除一位从数据库中创建了一些项目的经理:SQL不会让我们这样做。我们可以在子表“on DELETE CASCADE”中添加对fk ManagerID的约束,但在这种情况下,我们将丢失有关(例如)一个项目有多少名经理工作的信息。另一种选择是“ON DELETE SET NULL”,但由于ManagerID是Manager\u has\u Project的复合主键的一部分,因此我们不能将主键设置为NULL


建议怎么做?

如果要保留信息,请使用软删除,而不是实际删除行

也就是说,添加一列,例如
已删除
删除
,表示已删除
管理器
。然后,您可以保留所有信息,甚至是关于“已删除”经理的信息


您可以使用视图,以便“正常”查询只返回未删除的管理者。

管理者
管理者项目
中添加一个
状态
列。该列将告诉您关系的有效性。您很少删除数据库上的数据,因为“非活动数据”对审核、报告等很有用。通常,您还将添加列,如
中的VALID\u、
中的VALID\u、直到
的VALID\u、由
创建的
、由
更新的
等,以便获得有关更改内容和时间的所有详细信息。