随着时间的推移,系统需求会发生变化。这可能需要创建新的数据库、表和列以及更改现有的表结构。更改列的数据类型可能是微不足道的操作,也可能是困难的操作,具体取决于源和目标数据类型以及列中包含的数据。本篇文章将解决更改列数据类型时的一些常见挑战,以及你可以用来促进该过程的策略。
ALTER TABLE 语句
我们可以使用 ALTER TABLE 语句更改现有表的结构(模式)。它是一个数据定义语言(Data Definition Language,DDL)语句,就像 CREATE TABLE、DROP FUNCTION 和 GRANT 一样。它的基本语法是:
ALTER TABLE table_to_change what_to_change (additional_arguments)
ALTER TABLE 语句可用于更改各种表属性,从更改表名到添加、删除和修改列。
一个语句,不同的语法
你可能已经注意到,在第一行之后,ALTER TABLE 语句的语法变得非常模糊。那是因为它因供应商而异。例如:
在 SQL Server 中
ALTER TABLE table_name ALTER COLUMN column_name column_type;
在 PostgreSQL 中
ALTER TABLE table_name ALTER COLUMN column_name TYPE column_definition;
一个简单的示例
ALTER TABLE table_name MODIFY column_name column_type;
一个简单的示例
某些数据库(例如 Oracle)不允许你对包含数据的表运行 ALTER 查询。如果这样做,你将收到如下错误:
Error report: SQL Error: ORA-01439: column to be modified must be empty to change datatype 01439. 00000 – “column to be modified must be empty to change datatype”
但是,大多数数据库类型确实允许你对填充的表进行更改。
这是 Navicat Premium 的表设计器,显示了一个 MySQL 表的列定义:
我们可以运行 ALTER TABLE 语句将 name (VARCHAR) 列的容量增加到 255 个字符:
将列从 VARCHAR 转换为 INT
看到包含数字数据的 VARCHAR 列并不少见。在某些情况下,将其类型更改为数字类型可能是有利的。在 Navicat 中,我们可以从下拉列表中选择来设置列的类型:
点击“保存”按钮后即可保存更改。如果你忘记了,Navicat 会在你关闭表设计器时提示你保存更改。
数据截断错误
你应该尽可能避免减少列数据类型的大小;否则,你将收到数据截断错误,例如:
#1265 - Data truncated for column 'name' at row 2
处理此错误没有硬性规则,但通常,你可以自己更新有问题的值,然后重新运行 ALTER TABLE 语句。例如,下面的语句将所有 name 值截断为 10 个字符:
总结
这篇文章概述了更改列数据类型的一些常见挑战,以及你可以用来促进该过程的策略。
如果你对 Navicat Premium感兴趣,可以免费试用 14 天!
Rob Gravelle 居住在加拿大渥太华,是一名有 20 多年经验的 IT 专家。过往,Rob 曾为与情报有关的组织(如加拿大边境服务局和各种商业组织)构建系统。在业余时间,Rob 是一名出色的吉他演奏家,他拥有多张 CD 和数字发行版。