DB2需要有关alter table alter column set数据类型的帮助

时间:2011-10-26 15:40:17

标签: sql db2

我需要将列的数据类型从VARCHAR更改为DECIMAL

我在列中有数据,但它们都是数字值,如10.00, 25.50等,

现在当我alter table MY_TABLE alter column COL1 set data type to decimal(11,2)失败时。

我可以遵循这个过程。

我确定这不是一个新问题,但我找不到解决方案,所以不要嘲笑我的脑子,我在这里问。

4 个答案:

答案 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)

  • 检查col1col1_new之间的不同值,空值等的计数,记住10.0010.010会有不同的值在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;