手动删除数据库中冗余数据可能遇到外键关联导致数据无法删除的问题。这个问题的解决及思考记录如下:
问题的产生是因为在数据库设计的时候,在建立外键关联的时候没有设置级联删除,也就是说在设置外键的时候并没有加上on delete cascade限定。对于这个问题,我的想法是:在数据库设计的时候一般情况下都是应该加上这样的限制的。如果说担心“级联删除”可能会误删有用的数据,这种情况如果真的发生的话,那么就应该在数据库的设计上找原因了。
如果在数据库设计的时候设置了级联删除,那么本文提到的问题是不会发生的。如果不幸这样的状况发生了,那么可以根据它提示的关联外键,到user_constraints表中按constraint_name查找到唯一的记录,当然查询这个系统视图的用户权限应该比较高,然后在记录中找到table_name,最后编辑表的外键关联,将on delete触发的动作改为cascade。如果数据库中数据库表很多,关联关系比较复杂,那么很可能在遇到问题之后要修改的外键关联时的级联删除不止一个两个。
此外,说两个题外话:
第一,设置外键关联的时候,级联操作有三种设置方式:
默认无动作:on delete no action;
置空:on delete set null;
级联删除:on delete cascade。
第二,在drop表的时候,用drop table cascade constraints语句,只会删除子表与父表之间的关联关系,不会删除子表中关联父表的那些记录。