【发布时间】:2021-07-10 22:35:28
【问题描述】:
我需要使用 JDBC 更改 Db2 列。该列可能会更改其名称和/或类型。在 Db2 中,这两个操作分两步完成,第一个 ALTER TABLE 更改名称,第二个 ALTER TABLE 更改类型。
例如:
ALTER TABLE T1 RENAME COLUMN C1 TO C2;
ALTER TABLE T1 ALTER COLUMN C2 SET DATA TYPE decimal(4,0);
见下面的代码,第一条语句被执行,但第二条总是抛出异常。
String sql = "ALTER TABLE " + tableName + " RENAME COLUMN " +
originalName + " TO " + name;
PreparedStatement ps1 = conn.prepareStatement(sql);
ps1.executeUpdate();
sql = "ALTER TABLE " + tableName + " ALTER COLUMN " + name +
" SET DATA TYPE decimal(" + sc.getLength() + "," + sc.getDec() + ")";
PreparedStatement ps2 = conn.prepareStatement(sql);
ps2.executeUpdate();
例外是:
该操作未执行,因为该表处于无效状态 操作的状态。表名:“DB.T1”。 原因码:“23”.. SQLCODE=-20054, SQLSTATE=55019, DRIVER=4.27.25
表处于“无效状态”是什么意思?为什么表处于这种状态?这段代码有什么问题?
【问题讨论】:
-
是否在任何地方引用了原始列,例如在约束、视图定义等中?如果先更改数据类型再重命名会怎样?
-
问题仅在于一列,如果我创建一个新列,它可以正常工作。有任何想法吗?当我尝试重命名该特定列时,我什至重新启动了服务器并仍然收到此“无效状态”错误。
-
再次,您正在修改的列是否在约束、外键或视图定义中引用?
-
不,它没有被任何地方引用