在 MySQL 中更改列数据类型或属性
- 在 MySQL 中更改列数据类型或属性
-
使用
ALTER TABLE CHANGE
关键字修改 MySQL 数据库表中单个列的数据类型、约束或属性 -
使用
ALTER TABLE MODIFY
关键字修改 MySQL 数据库表中单个列的数据类型、约束或属性 -
使用
ALTER TABLE
关键字修改 MySQL 数据库表中多列的数据类型、约束或属性
数据库设计通常是迭代的,随着需求的变化和初始设计的重新调整。MySQL 是一个强大的 RDBMS,它允许使用 ALTER TABLE
关键字修改现有/声明的表列。
本教程说明了使用 ALTER TABLE
关键字来修改 MySQL
数据库中现有列的数据类型、约束或属性。
在 MySQL 中更改列数据类型或属性
ALTER TABLE
关键字可以与其他关键字组合以实现必要的修改。在 MySQL 中,CHANGE
关键字是标准 SQL 的主要扩展。
但是,为了与 Oracle 兼容,MODIFY
关键字是一个可用的扩展。
CHANGE
或 MODIFY
关键字实现了相同的结果,但在语法便利性和稳健性方面略有权衡。为了说明这些概念,让我们创建一个带有名为 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
关键字一次可以对列进行三种类型的修改。
- 它可以重新定义列的数据类型和约束。
- 它可以重命名一个列。
- 它可以用
FIRST
或AFTER
关键字对表中的列进行重新排序。
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 NULL
和 DEFAULT
约束。
-- 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 KEY
或 UNIQUE
等约束不需要重新指定。
现在,让我们将列重命名为 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 数据库表中多列的数据类型、约束或属性
前面说明的方法同样适用于多列。但是,MODIFY
或 CHANGE
语句会根据要更改的列数重复。
有关这方面的更多详细信息,请参阅此参考。
让我们为 year_of_release
和 prog_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 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