在 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