1、业务需求
关系型数据库中,表与表之间存在关联,是很常见的,因此也得名关系型数据库。其中,外键是一个重要特性。主从之间存在一对多、多对多的关系。
经常遇到这样的业务需求。删除一条订单时,要删除该条订单相关联的所有支出记录、付款记录、评论记录、商品记录;在删除一个商品分类时,则不能删除该分类下的所有商品,而是要将商品的分类清空。一般情况下,我们通过编码,在数据层采用事务的方式去实现。
采用太极平台框架后,我们要尽量减少编码,甚至不编码。所以将采用数据库的外键特性,自动去实现功能需求。
借用订单表、订单支出表、订单收款表,建立外键关系如下。删除订单时,同步删除该条记录相关的支出记录、付款记录。
2、建立外键解决
在订单支出表qd_order_cost中,将字段OrderId设置为外键,与订单表qd_order的主键Id字段进行关联。这里的重点,是设置删除时的属性。
- 设置为CASCADE,则会级联删除。即删除了主表记录,从表记录就相应删除;下面还有从表外键,也会继续删除。
- 设置为SET NULL,则会清空从表的字段值,设置为null。此时从表的OrderId字段,要设置为允许null。
- 设置为RESTRICT,则会严格校验,如果从表有数据,则不允许删除。删除时会报异常。太极平台能独立识别此异常,并返回友好的提示给用户“删除失败,子表下有外键数据”。所以想要实现此效果,也不需要编码进行判断。在数据库层面进行限制即可。
- 设置NO ACTION,则不进行任何处理。
所以根据需求,删除订单时,想同步删除订单下的所有从表数据,则从表的外键删除选项,设置为CASCADE;不需要删除,则可以设置SET NULL或者NO ACTION;限制不能删除,则可以设置为RESTRICT。