truncate和delete的区别,我相信大家都清楚。
truncate会清空表的全部数据,且自增主键会重置;而delete可以按条件删除,且自增主键不会重置。
我们日常测试过程中经常要删除掉测试数据,那么应该用truncate删,还是用delete删呢?
最近测试中就发现一个诡异的问题,排查了下来原来是我用truncate清理数据导致的。实际的问题有点绕,这里为了大家方便理解,我转化一下。
比如我有一张订单表,关联订单行,在测试过程中,我创建了一个订单,结果多出了几条不是我创建的订单行数据。原因是我清理测试数据时,为了方便使用truncate清理了order表,但是没有清理order_entry,order表的自增主键重置了,所以恰好新的订单ID就跟旧的订单行产生了关联。
truncate会导致自增主键重置,有利有弊,好处是清理的彻底,坏处是你最好把它的关联边表一并清理,否则就可能会发生上面这这种问题,给你的测试带来阻碍。
这种情况使用delete删除数据就可以了,只需要把主表数据delete,关联数据可以不用清理。
但是对于不存在关联的表,还是可以大胆使用truncate清理的。