Navicat 博客

在关系数据库中更改列的数据类型 2021 年 9 月 10 日,由 Robert Gravelle 撰写

随着时间的推移,系统需求会发生变化。这可能需要创建新的数据库、表和列以及更改现有的表结构。更改列的数据类型可能是微不足道的操作,也可能是困难的操作,具体取决于源和目标数据类型以及列中包含的数据。本篇文章将解决更改列数据类型时的一些常见挑战,以及你可以用来促进该过程的策略。

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 表的列定义:

brands_table_design (95K)

我们可以运行 ALTER TABLE 语句将 name (VARCHAR) 列的容量增加到 255 个字符:

alter_name_column (27K)

将列从 VARCHAR 转换为 INT

看到包含数字数据的 VARCHAR 列并不少见。在某些情况下,将其类型更改为数字类型可能是有利的。在 Navicat 中,我们可以从下拉列表中选择来设置列的类型:

brand_code_type (35K)

点击“保存”按钮后即可保存更改。如果你忘记了,Navicat 会在你关闭表设计器时提示你保存更改。

数据截断错误

你应该尽可能避免减少列数据类型的大小;否则,你将收到数据截断错误,例如:

#1265 - Data truncated for column 'name' at row 2

处理此错误没有硬性规则,但通常,你可以自己更新有问题的值,然后重新运行 ALTER TABLE 语句。例如,下面的语句将所有 name 值截断为 10 个字符:

update_brands (10K)

总结

这篇文章概述了更改列数据类型的一些常见挑战,以及你可以用来促进该过程的策略。

如果你对 Navicat Premium感兴趣,可以免费试用 14 天!



Rob Gravelle 居住在加拿大渥太华,是一名有 20 多年经验的 IT 专家。过往,Rob 曾为与情报有关的组织(如加拿大边境服务局和各种商业组织)构建系统。在业余时间,Rob 是一名出色的吉他演奏家,他拥有多张 CD 和数字发行版

Navicat 文章
频道条目
分享
文章归档