更改数据库中列的数据类型

Posted

技术标签:

【中文标题】更改数据库中列的数据类型【英文标题】:Changing datatype of a column in database 【发布时间】:2015-10-20 05:05:21 【问题描述】:

我必须在数据库中将列的数据类型从 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 【参考方案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 然后尝试

以上是关于更改数据库中列的数据类型的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 BigQuery 中列的数据类型

是否可以更改视图中列的数据类型?

更改 SQL Server DB 中列的数据类型时出错 - Java

如何更改 SQL Server 中列的数据类型?

更改列名的几种方法在数据库中

更改 SQL 列的数据类型时更新 SSIS 包