DDL中极易混淆的操作:rename

最后更新:2023-10-18 19:51:43 | 状态:未完成
修改表名或列名的操作比较特殊,

先看一个最终执行的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 新表名);


对于除了表和列之外的其他对象如存储过程、函数、处罚器等并不是每个数据库都支持重命名,为了多数据库兼容最好先删除再重建

最近更新 搜索 提交