上线脚本跑到一半报错,说要删的表不存在,整个发布卡住了。回滚重跑又怕删错,盯着屏幕不敢动。这种场景加一句存在性判断就行,存在才执行,不存在直接跳过,脚本跑几遍都安全。

判存在到底在判什么

可以理解成执行前的安检,先问系统有没有这个对象,有才动手。删表、删库、删视图、删过程都能配这句,不同对象写法略有差别,但意思一样。加了它,多次跑同一脚本不会报错,适合上线和初始化脚本。注意它只管有没有,不管权限够不够,权限不足还是会报错。

删表删库的标准写法

删表时在表名前加存在判断,临时表和正式表都能用,写上线脚本必备。删库同样,先判断再删,误伤概率小很多。删视图、删索引也各有对应写法,索引有些版本要在表上指定。只删数据不删结构时用清空语句,想连结构一起拿掉才用删除语句,新手经常把这两个搞混。

建表建库时防重复的写法

建表前加不存在才建,表已存在就跳过,不会覆盖老数据。建库同理,多人共用开发库时你争我抢也报不了错。有些版本建索引不支持直接判断,先查系统表确认没有再建,或者干脆删了重建。初始化脚本里建表、插默认数据、建索引一套全加上判断,重跑多少次都稳。

几个容易踩的点

判断存在不等于判断数据对,先看表在不在,还要看字段对不对得上,老表结构变了脚本跑完也可能埋雷。删库语句一旦真执行,数据找不回来,上线前先备份再跑。大小写敏感的库名,判断时也要写对,大小写错一个字母就当成不存在,重建出来两个表最难受。跨版本迁移时,先在测试库跑一遍,确认判断语法被支持再上生产。

  • 上线脚本必备:删和建都加存在判断,重跑不报错
  • 删前备份:判断只防报错不防误删,删库前一定备份
  • 别只判表名:老表结构变了,字段也要核对一遍
DROP TABLE IF EXISTS 订单表CREATE TABLE IF NOT EXISTS 用户表(编号 整数主键)DROP DATABASE IF EXISTS 测试库CREATE DATABASE IF NOT EXISTS 新库DROP VIEW IF EXISTS 统计视图