在 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
关键字一次可以对列进行三种类型的修改。
-- 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
相关文章
使用 Mysqldump 备份 MySQL 中的数据
发布时间:2023/05/09 浏览次数:192 分类:MySQL
-
本篇文章将介绍如何使用 mysqldump 只备份数据。 在这里,我们将探讨 --no-create-info 、--compact 、--skip-triggers 和 --no-create-db 选项。
更新 MySQL 表中的主键
发布时间:2023/05/09 浏览次数:61 分类:MySQL
-
本篇文章介绍如何更新 MySQL 表中的主键。 我们将使用 ALTER 命令对主键进行任何更改。更新 MySQL 表中的主键 我们可以在多种情况下更新 MySQL 表中的主键。
在 MySQL 中获取命令历史记录
发布时间:2023/05/09 浏览次数:150 分类:MySQL
-
本文重点介绍了在 Windows 和 Linux 中获取我们已执行的 MySQL 命令历史记录的各种方法。MySQL命令历史
Oracle 的 decode 函数在 MySQL 中的等价物
发布时间:2023/05/09 浏览次数:115 分类:MySQL
-
本篇文章介绍了三种替代实现,我们可以将它们用作 MySQL 中 Oracle 的 decode() 函数的等价物。 为此,我们将使用 IF()、CASE 以及 FIELD() 和 ELT() 的组合。
使用 Ubuntu 连接远程 MySQL 服务器的不同方法
发布时间:2023/05/09 浏览次数:97 分类:MySQL
-
在本文中我们将学习如何使用 Ubuntu 连接远程 MySQL 服务器来操作数据以及启动和停止 MySQL 服务器。
在 Linux 中安装 MySQL 客户端
发布时间:2023/05/09 浏览次数:72 分类:MySQL
-
在 Linux 中安装 MySQL 客户端的命令。Linux 和 Unix 等环境作为命令行界面工作,仅在命令的帮助下运行。
在 MySQL 中转换为十进制
发布时间:2023/05/09 浏览次数:150 分类:MySQL
-
有时,我们可能需要将一种数据类型转换为另一种数据类型。 下面是我们如何使用带有 DECIMAL(M,D) 的 CAST() 和 CONVERT() 函数在 MySQL 中转换为十进制。
在 MySQL 中获取当前日期和时间
发布时间:2023/05/09 浏览次数:145 分类:MySQL
-
本篇文章我们将学习 NOW()、CURRENT_TIMESTAMP()(也写为 CURRENT_TIMESTAMP)和 SYSDATE() 来获取 MySQL 中的当前日期和时间。 我们还将看到这三个功能之间的比较。在 MySQL 中获取当前日期和时间
更改 MySQL 服务器中的 max_allowed_packet Size
发布时间:2023/05/09 浏览次数:142 分类:MySQL
-
本篇文章介绍如何更改 MySQL 服务器中的 max_allowed_packet 大小。 为了了解这一点,我们将使用两个操作系统,Windows 10 和 Linux (Ubuntu)。