【问题标题】:Changing datatype of a column in database更改数据库中列的数据类型
【发布时间】:2024-05-18 16:05:02
【问题描述】:

我必须在数据库中将列的数据类型从 CHAR 更改为 INTEGER。我使用了以下查询:

ALTER TABLE cert_request
    ALTER column CERT_REQUEST_NBR SET TYPE(INTEGER);

但是,它在关键字“column”中显示错误,并在执行时将错误代码显示为 -104。以下是错误日志;

Error: DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=ALTER TABLE CERT_REQUEST   ALTER CERT_R;BEGIN-OF-STATEMENT;<create_proc>, DRIVER=3.50.152
SQLState:  42601
ErrorCode: -104

我也尝试过使用 Modify 关键字,但在我的数据库中没有发现它。

我也尝试了以下查询,但再次没有用。

alter table CERT_REQUEST alter column cert_request_nbr  integer

它给出了以下错误

Error: DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=integer;umn cert_request_nbr;<alter_col_action1>, DRIVER=3.50.152
SQLState:  42601
ErrorCode: -104

请给我一些建议。

【问题讨论】:

  • 在您更改之前,您的列类型是什么?
  • 使用类型转换CAST(CERT_REQUEST_NBR AS UNSIGNED)
  • SELECT CAST(column AS INTEGER) FROM cert_request 检查是否有无法转换为INT的数据
  • @Viandry 我已经在帖子中提到过,我必须从“CHAR”更改为 INTEGER
  • @pkn1230 您可能拥有无法转换为 INT 的 'aaa' 之类的数据。首先将它们更新为 NULL,然后使用简单的ALTER TABLE

标签: sql database db2


【解决方案1】:

使用 MySQL 类型转换或 ALTER

ALTER TABLE cert_request MODIFY CERT_REQUEST_NBR INTEGER;

或者试试 MySQL 类型转换

CAST(CERT_REQUEST_NBR AS UNSIGNED)

【讨论】:

    【解决方案2】:

    你必须在 MYSQL 中使用 MODIFY 而不是 ALTER

    ALTER TABLE cert_request
        MODIFY CERT_REQUEST_NBR INTEGER;
    

    在 DB2 中你可以这样尝试:

    ALTER TABLE cert_request ADD COLUMN Temporary INTEGER;
    UPDATE cert_request SET Temporary=CAST(CERT_REQUEST_NBR AS INTEGER);
    ALTER TABLE cert_request DROP COLUMN CERT_REQUEST_NBR;
    ALTER TABLE cert_request CHANGE Temporary CERT_REQUEST_NBR INTEGER;
    

    【讨论】:

    • 除了创建一个新列然后删除原来的列之外,还有其他选择吗?
    • @pkn1230:- 理想情况下,Alter column 命令应该可以工作,但因为它不适合您。所以这引起了我的注意;)
    • @pkn1230:- 你能检查一下你的列,看看是否有任何值不能转换为 INT 之类的 'a' 之类的东西吗?
    • 它只包含数值,
    • @pkn1230:- 你能说出这个查询的结果是什么吗:select CASE WHEN LENGTH(RTRIM(TRANSLATE(CERT_REQUEST_NBR, '*', ' 0123456789'))) = 0 THEN 'All digits' ELSE 'No' END from cert_request
    【解决方案3】:

    你试过了吗:

    ALTER TABLE `cert_request` CHANGE `CERT_REQUEST_NBR` `CERT_REQUEST_NBR` INT(10) NOT NULL;
    

    注意任何不是整数的数据都会丢失。

    【讨论】:

      【解决方案4】:

      如果您指定您正在使用的数据库将会很有帮助。在 oracle 中,解决方案应该是

      Alter table cert_request modify CERT_REQUEST_NBR number(30)
      

      在db2中(根据你提供的错误,我相信你的数据库是db2)解决办法是

      Alter table cert_request alter column CERT_REQUEST_NBR set datatype decimal(30)
      

      【讨论】:

        【解决方案5】:

        您在“Set”和“Type”之间缺少“Data”一词。

        应该是这样的:

        ALTER TABLE cert_request ALTER 列 CERT_REQUEST_NBR SET DATA TYPE(INTEGER);

        【讨论】:

          【解决方案6】:

          可能是,由于字段值中存在 varchar 数据而发生。

          删除该数据,然后运行您的查询

          【讨论】:

            【解决方案7】:

            这是因为您的列包含非整数数据。您将需要删除这些数据并尝试,或者您可以运行上述帖子中提到的查询,这将使您的数据为空,而不是 int。

            【讨论】:

            • @ Jayanti ,我已将列中所有行的值设置为“1”,这是一个整数值。但我仍然没有执行查询
            • ok..首先将您的数据转换为 int 因为目前您的 1 将被视为 char..所以首先将其转换为 int 然后尝试