DDL中极易混淆的操作:rename
先看一个最终执行的SQL
RENAME TABLE 原表名 TO 新表名
与其他修改属性的操作不一样的新名与原表名与新表名都需要保留,否则就不知道要修改的是哪个表或哪个列了。这不像在Java中可以引用传址。
这里有一个需要记住的方法
Table origin = new Table("原表名");
origin.setName("新表名") //这样操作是错误的,因为原表名被覆盖了
应该这样:
Table update = origin.update() //这样会创建一个复本,同时返回复本。
在创建复本之后,原来的origin只有一个作用就是用来记录原表名。在后续DDL操作中其他属性将被完全忽略。所以不要在origin上添加列,修改属性等操作。
要添加列应该在创建的复本上执行 update.addColumn("CODE","INT");
同时要注意改名操作不会检测新名称是否存在 所以改名前要确保 新名称 没有被占用
为了方避免误操作,我们把针对origin的操作默认映射到update,也就是说在执行了update()之后,在origin上执行的set/get(除了catalog,schema,name,drop)操作相当于在origin上操作
如果由于业务需要origin还需要继续操作,在调用update(false,false)可以提供两个参数。这样origin上的set/get操作可以继续原原效果执行,不会影射到update上
如果规则太麻烦记不住,可以把改名单独执行,service.rename(Table table, String 新表名);
对于除了表和列之外的其他对象如存储过程、函数、处罚器等并不是每个数据库都支持重命名,为了多数据库兼容最好先删除再重建