三年前曾问过一个问题:到底在做数据库设计时要不要外键约束?
如今看来,虽然外键约束能在一定程序上保证数据库数据的一致性,比如做了级联更新或级联删除,程序里不用特别对关联表做相应操作,数据库里即可以即时级联同步。但对后续的数据库修改,却是极不利的。
比如最近需求修改,三年前项目里主键全是int类型,现在int类型不能满足实际需求,需要对主键升级为varchar类型,这时问题就来了,做了外键约束的主键,修改不了字段类型,报错Error on rename of ‘.\dbname#sql-1780_2’ to ‘.\dbname\commodity_type_info’ (errno: 150)。初步估计需要删除外键约束才能解决问题,但前期项目里已经没有对关联表做相应操作,此时删除外键,这个后果,只能呵呵了。。。。。。
所以以后做数据库设计时,一定要记住前车之鉴了,只需设计主键,至于关联表的操作,在程序里处理好相关逻辑。