我需要将列的数据类型从VARCHAR
更改为DECIMAL
我在列中有数据,但它们都是数字值,如10.00, 25.50
等,
现在当我alter table MY_TABLE alter column COL1 set data type to decimal(11,2)
失败时。
我可以遵循这个过程。
我确定这不是一个新问题,但我找不到解决方案,所以不要嘲笑我的脑子,我在这里问。
答案 0 :(得分:4)
语法是
ALTER TABLE {tableName} MODIFY {Column-Name} {New-Column-Definition}
I.E. ALTER TABLE MY_TABLE MODIFY COL1 DECIMAL(11,2)
击>
通常这(改变列数据类型)不会将现有数据转换为新类型,并且可能将不兼容的值设置为NULL(或者它可以进行智能转换,它几乎是DBMS服务器特定的)
如果数据量不是太高,你可以这样做
ALTER TABLE MY_TABLE ADD COLUMN Temporary decimal(11,2);
UPDATE MY_TABLE SET Temporary=CAST(COL1 AS DECIMAL(11,2));
ALTER TABLE MY_TABLE DROP COLUMN COL1;
ALTER TABLE MY_TABLE CHANGE Temporary COL1 decimal(11,2);
编辑:第一部分可能不正确
答案 1 :(得分:0)
我假设DB2不允许您提供数据转换的指南,但我向SQL Server的神祈祷。
根据这个假设,添加一个新列,迁移数据,验证您的工作,删除原始列,重命名新列。
ALTER TABLE MY_TABLE ADD col1_new decimal(11,2) NULL
UPDATE MY_TABLE SET col1_new = CAST(col1 AS decimal(11,2)
检查col1
和col1_new
之间的不同值,空值等的计数,记住10.00
,10.0
和10
会有不同的值在varchar
中,decimal
中有一个值。听起来这不是您的数据中的问题,但如果计数不同则需要查找
ALTER TABLE MY_TABLE DROP COLUMN col1
我不知道sp_rename
的db2等价物是什么
答案 2 :(得分:0)
尝试删除“SYSTOOLS”模式下的系统表。然后尝试再次更改它。
答案 3 :(得分:0)
我试过@apokryfos解决方案,它运行正常! 虽然它不完整,但有些SQL命令失败并出现错误 SQLCODE:-668,SQLSTATE:57016
示例:
SELECT count(COLUMN)
FROM SCHEMA.TABLE_NAME
WHERE id = ID_NUMBER
FETCH FIRST 1 ROWS ONLY
这会失败!
要解决此问题,您需要重新调整表格。打开DB2 Shell,然后键入以下命令:
db2 connect to <your database name here> db2 REORG TABLE SCHEMA.TABLE_NAME
REORG还有一个SQL命令,但我没有尝试过:
CALL SYSPROC.ADMIN_CMD('REORG TABLE SCHEMA.TABLENAME');
<强>参考:强> Failing update table in db2 with SQLCODE: -668, SQLSTATE: 57016, SQLERRMC: 7;