-
05-07-2019 - |
题
我有一个表,部门,有几个位字段来表示部门类型 一个是仓库(当为真时,表明部门是仓库)
我还有一个表,ManagersForWarehouses具有以下结构:
ID autoinc
WarehouseID int (foreign key reference DepartmentID from departments)
ManagerID int (foreign key reference EmployeeID from employees)
StartDate
EndDate
要设置仓库的新经理,我在此表中插入EndDate null,并且我有一个触发器,为该仓库的先前记录设置EndDate =新经理的StartDate,因此在某个仓库中会出现一个单独的经理时间。
我想添加两个检查约束,如下所示,但不知道如何执行此操作
- 如果WarehouseID未标记为仓库 ,则不允许插入ManagersForWarehouses
- 如果ManagersForWarehouses中有记录 ,则不允许取消选中仓库 醇>
由于
解决方案
- 在Departments表中,添加唯一约束(DepartmentID,IsWarehouse)
- 在ManagersForWarehouses表中,添加列IsWarehouse,并使CHECK约束强制执行IsWarehouse ='Y'
- 在ManagersForWarehouses表中,添加FK on(WarehouseID,IsWarehouse)引用Departments(DepartmentID,IsWarehouse)和ON UPDATE CASCADE子句。 醇>
你们都拥有100%坚如磐石的完整性,没有任何漏洞。只有受信任的约束没有任何漏洞。触发器不太可靠。
其他提示
您应该使用触发器来执行此操作。每张桌子一个。确保考虑多个记录插入,更新或删除。做任何其他事情都会使您的数据面临风险。数据不会仅从应用程序进入数据库。除非您希望数据不正确且无用,否则您无法从应用程序中强制执行此类操作。
不要在数据库表上加上这种约束。
最好使用代码(业务逻辑)来强制执行此类操作。
编辑:与您的问题无关,但您也不应使用触发器对其他行执行更新。我没有可靠的链接支持它。
不隶属于 StackOverflow