更改数据库中列的数据类型
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 然后尝试以上是关于更改数据库中列的数据类型的主要内容,如果未能解决你的问题,请参考以下文章