在 MySQL 中更改列数据类型或属性

Victor A. Oguntuase 2023年1月30日
  1. 在 MySQL 中更改列数据类型或属性
  2. 使用 ALTER TABLE CHANGE 关键字修改 MySQL 数据库表中单个列的数据类型、约束或属性
  3. 使用 ALTER TABLE MODIFY 关键字修改 MySQL 数据库表中单个列的数据类型、约束或属性
  4. 使用 ALTER TABLE 关键字修改 MySQL 数据库表中多列的数据类型、约束或属性
在 MySQL 中更改列数据类型或属性

数据库设计通常是迭代的,随着需求的变化和初始设计的重新调整。MySQL 是一个强大的 RDBMS,它允许使用 ALTER TABLE 关键字修改现有/声明的表列。

本教程说明了使用 ALTER TABLE 关键字来修改 MySQL 数据库中现有列的数据类型、约束或属性。

在 MySQL 中更改列数据类型或属性

ALTER TABLE 关键字可以与其他关键字组合以实现必要的修改。在 MySQL 中,CHANGE 关键字是标准 SQL 的主要扩展。

但是,为了与 Oracle 兼容,MODIFY 关键字是一个可用的扩展。

CHANGEMODIFY 关键字实现了相同的结果,但在语法便利性和稳健性方面略有权衡。为了说明这些概念,让我们创建一个带有名为 Details 的表的 programming_languages 数据库。

/* Here goes the definition of the database */
CREATE DATABASE programming_languages;
USE programming_languages;

-- Creating a details table
CREATE TABLE Details(
	id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(25) UNIQUE,
    year_released VARCHAR (5),
    PRIMARY KEY(id)
    );
-- Populating Details with information
INSERT INTO Details (name, year_released) VALUES ('python', 1991),('c++', 1985),('Java', 1995);
SELECT * FROM Details ORDER BY id;

DESCRIBE Details year_released;  -- Checking the column information

输出:

id	name	year_released
1	python	1991
2	c++		1985
3	Java	1995
-----------------------------------------------------------------------------------------
Field			Type		Null	Key	Default	Extra
year_released	varchar(5)	YES			NULL

让我们修改 year_released 列以实现 YEAR 数据类型而不是 VARCHAR

使用 ALTER TABLE CHANGE 关键字修改 MySQL 数据库表中单个列的数据类型、约束或属性

CHANGE 关键字一次可以对列进行三种类型的修改。

  1. 它可以重新定义列的数据类型和约束。
  2. 它可以重命名一个列。
  3. 它可以用 FIRSTAFTER 关键字对表中的列进行重新排序。
注意
使用 ALTER 语句时,包括初始列定义和约束,以确保它们反映在修改后的列中。例如,如果一个列有一个 NOT NULL 约束,它必须在 ALTER 语句中重新指定。
 -- changing the datatype of year_released from VARCHAR to YEAR
 ALTER TABLE Details
 CHANGE year_released year_released YEAR;

 DESCRIBE Details year_released;  -- Running again, to confirm changes

输出:

Field			Type	Null	Key	Default	Extra
year_released	year	YES			NULL

请注意目标列的名称是如何包含两次的。这是使用 CHANGE 的语法不便之处,因为它希望指定修改列的名称。

我们将名称重新指定为 year_released 以保留原始列名称。但是,当需要同时修改属性和列名时,这种假定的不便变得有效。

然后,可以在同一行中执行这样的操作。

例如,让我们将列名更改为 year_of_release 并包含 NOT NULLDEFAULT 约束。

-- Altering YET AGAIN
ALTER TABLE Details
CHANGE year_released year_of_release YEAR NOT NULL DEFAULT '1990';

DESCRIBE Details year_of_release;

输出:

Field			Type	Null	Key	Default	Extra
year_of_release	year	NO			1990

虽然这可行,但更改列名的推荐方法是使用 RENAME COLUMN 关键字。RENAME 只需要列的当前/旧名称和新名称。

ALTER TABLE Details
RENAME COLUMN year_of_release TO year_released;

DESCRIBE Details year_released;  -- Viewing changes

输出:

Field			Type	Null	Key	Default	Extra
year_released	year	NO			1990

有关 CHANGE 关键字用法的更多详细信息,请查看此官方文档

使用 ALTER TABLE MODIFY 关键字修改 MySQL 数据库表中单个列的数据类型、约束或属性

替代的 MODIFY 关键字提供与 CHANGE 关键字相同的功能,但它不支持在其表达式中重命名列。要重命名列,请将 MODIFY 关键字与 RENAME COLUMN 关键字结合起来,如前所述。

这一次,让我们重新定义 name 列以接受具有 NOT NULL 约束的三十 (30) 个字符的 VARCHAR

-- Altering with MODIFY
ALTER TABLE Details
MODIFY name VARCHAR(30) NOT NULL DEFAULT 'None';

DESCRIBE Details name;

输出:

Field	Type		Null	Key	Default	Extra
name	varchar(30)	NO		UNI	None

请注意 UNIQUE 约束如何延续到更改后的列。PRIMARY KEYUNIQUE 等约束不需要重新指定。

现在,让我们将列重命名为 prog_language_name 并通过将 MODIFY 关键字与 RENAME COLUMN 结合使用来允许 NULL 值。

ALTER TABLE Details
-- Allowing Null values by not specifying NOT NULL
MODIFY name VARCHAR(30) DEFAULT 'None';

-- Renaming the column
ALTER TABLE Details
RENAME COLUMN name TO prog_language_name;

-- Viewing the changes
DESCRIBE Details prog_language_name;

输出:

Field				Type		Null	Key	Default	Extra
prog_language_name	varchar(30)	YES		UNI	None

使用 ALTER TABLE 关键字修改 MySQL 数据库表中多列的数据类型、约束或属性

前面说明的方法同样适用于多列。但是,MODIFYCHANGE 语句会根据要更改的列数重复。

有关这方面的更多详细信息,请参阅此参考

让我们为 year_of_releaseprog_language_name 列设置 NOT NULL 约束和默认值。

ALTER TABLE Details
MODIFY prog_language_name VARCHAR(30) NOT NULL DEFAULT 'No Data',
MODIFY year_released year NOT NULL DEFAULT '1950';

DESCRIBE Details

输出:

Field				Type		Null	Key		Default		Extra
id					int			NO		PRI		NULL		auto_increment
prog_language_name	varchar(30)	NO		UNI		No Data
year_released		year		NO				1950
Victor A. Oguntuase avatar Victor A. Oguntuase avatar

Victor is an experienced Python Developer, Machine Learning Engineer and Technical Writer with interests across various fields of science and engineering. He is passionate about learning new technologies and skill and working on challenging problems. He enjoys teaching, intellectual discourse, and gaming, among other things.

LinkedIn GitHub

相关文章 - MySQL Column