在 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