一文徹底吃透MySQL?DDL操作之?dāng)?shù)據(jù)庫(kù)、數(shù)據(jù)表、字段全解析
前言
在 MySQL 數(shù)據(jù)庫(kù)管理體系中,DDL(Data Definition Language,數(shù)據(jù)定義語(yǔ)言)是構(gòu)建數(shù)據(jù)庫(kù)結(jié)構(gòu)的 “基石”,它負(fù)責(zé)定義數(shù)據(jù)庫(kù)、數(shù)據(jù)表、字段等核心對(duì)象的結(jié)構(gòu)與屬性,不涉及數(shù)據(jù)的增刪改查,僅聚焦于 “結(jié)構(gòu)層面” 的操作。對(duì)于 MySQL 初學(xué)者而言,熟練掌握 DDL 是入門數(shù)據(jù)庫(kù)開發(fā)的第一步。本文將結(jié)合實(shí)戰(zhàn)場(chǎng)景,對(duì)數(shù)據(jù)庫(kù)、數(shù)據(jù)表、字段的 DDL 操作進(jìn)行超詳細(xì)解析,不僅講解語(yǔ)法本身,還拆解背后的邏輯和實(shí)際應(yīng)用場(chǎng)景。
一、數(shù)據(jù)庫(kù)級(jí)別的 DDL 操作
數(shù)據(jù)庫(kù)是數(shù)據(jù)表的 “容器”,所有數(shù)據(jù)表都必須歸屬某一個(gè)數(shù)據(jù)庫(kù)。在操作數(shù)據(jù)表前,首先要掌握數(shù)據(jù)庫(kù)的創(chuàng)建、查看、修改、刪除等核心操作,確保能精準(zhǔn)管理數(shù)據(jù)庫(kù)容器。
1. 查看所有數(shù)據(jù)庫(kù)
語(yǔ)法:
show databases;
詳細(xì)解釋:
- 執(zhí)行該語(yǔ)句后,MySQL 會(huì)返回當(dāng)前服務(wù)器實(shí)例中所有已創(chuàng)建的數(shù)據(jù)庫(kù)列表(包含系統(tǒng)庫(kù)和自定義庫(kù))。
- 系統(tǒng)庫(kù)說明:MySQL 默認(rèn)自帶
information_schema(存儲(chǔ)數(shù)據(jù)庫(kù)元數(shù)據(jù))、mysql(存儲(chǔ)用戶權(quán)限)、performance_schema(性能監(jiān)控)、sys(簡(jiǎn)化性能分析)等系統(tǒng)庫(kù),這些庫(kù)用于支撐 MySQL 運(yùn)行,禁止隨意修改或刪除。- 應(yīng)用場(chǎng)景:日常開發(fā)中,先執(zhí)行該語(yǔ)句確認(rèn)已有數(shù)據(jù)庫(kù),避免創(chuàng)建重復(fù)數(shù)據(jù)庫(kù),或快速定位目標(biāo)數(shù)據(jù)庫(kù)。
2. 創(chuàng)建數(shù)據(jù)庫(kù)
創(chuàng)建數(shù)據(jù)庫(kù)有 “默認(rèn)編碼” 和 “指定編碼” 兩種方式,編碼選擇直接影響后續(xù)數(shù)據(jù)存儲(chǔ)的字符兼容性(如中文是否亂碼)。
語(yǔ)法 1:使用默認(rèn)編碼創(chuàng)建
create database day01;
詳細(xì)解釋:
- MySQL 8.0 及以上版本默認(rèn)編碼為
utf8mb4(兼容所有 Unicode 字符,包括 emoji 表情),MySQL 5.7 及以下版本默認(rèn)編碼為utf8(僅兼容部分 Unicode 字符)。- 適用場(chǎng)景:無(wú)特殊字符要求(如僅存儲(chǔ)英文、數(shù)字、普通中文)時(shí),可使用默認(rèn)編碼快速創(chuàng)建。
語(yǔ)法 2:指定編碼創(chuàng)建
create database day02 charset 'gbk';
詳細(xì)解釋:
charset(全稱character set)用于指定數(shù)據(jù)庫(kù)的默認(rèn)字符集,此處指定為gbk(適用于簡(jiǎn)體中文場(chǎng)景,兼容 GB2312)。- 注意事項(xiàng):指定編碼時(shí),字符集名稱需加單引號(hào)(部分版本不加也可,但加單引號(hào)是規(guī)范寫法);
gbk編碼不支持 emoji 表情,若需存儲(chǔ)特殊字符,優(yōu)先選擇utf8mb4。- 適用場(chǎng)景:對(duì)接老舊系統(tǒng)(如基于 GBK 編碼的傳統(tǒng)項(xiàng)目)時(shí),需指定對(duì)應(yīng)編碼避免亂碼。
3. 安全創(chuàng)建數(shù)據(jù)庫(kù)(重點(diǎn))
語(yǔ)法:
create database if not exists day01;
詳細(xì)解釋:
if not exists是 “安全創(chuàng)建” 的核心:先檢查目標(biāo)數(shù)據(jù)庫(kù)是否存在,若不存在則創(chuàng)建,若已存在則不執(zhí)行任何操作,且不會(huì)報(bào)錯(cuò)。- 對(duì)比普通創(chuàng)建:直接執(zhí)行
create database day01時(shí),若day01已存在,MySQL 會(huì)拋出1007 - Can't create database 'day01'; database exists錯(cuò)誤,導(dǎo)致腳本中斷;而添加if not exists后,腳本可正常執(zhí)行。- 應(yīng)用場(chǎng)景:編寫自動(dòng)化部署腳本、初始化數(shù)據(jù)庫(kù)時(shí),必須使用該語(yǔ)法,保證腳本的健壯性。
4. 查看數(shù)據(jù)庫(kù)詳細(xì)信息
語(yǔ)法:
show create database day01; show create database day02;
詳細(xì)解釋:
- 執(zhí)行結(jié)果包含兩列:
Database(數(shù)據(jù)庫(kù)名)、Create Database(完整的創(chuàng)建語(yǔ)句),不僅能看到字符集,還能看到數(shù)據(jù)庫(kù)的排序規(guī)則(如utf8mb4_0900_ai_ci)。- 排序規(guī)則說明:
ai表示不區(qū)分重音,ci表示不區(qū)分大小寫,這會(huì)影響后續(xù)數(shù)據(jù)查詢的匹配規(guī)則(如where name = 'Tom'是否能匹配'tom')。- 應(yīng)用場(chǎng)景:排查字符集亂碼問題時(shí),首先通過該語(yǔ)句確認(rèn)數(shù)據(jù)庫(kù)的實(shí)際編碼,避免 “以為指定了編碼,實(shí)際未生效” 的情況。
5. 修改數(shù)據(jù)庫(kù)編碼
語(yǔ)法:
alter database day01 charset 'gbk';
詳細(xì)解釋:
alter database用于修改數(shù)據(jù)庫(kù)的屬性,此處僅修改字符集為gbk。- 注意事項(xiàng):修改數(shù)據(jù)庫(kù)編碼僅影響后續(xù)創(chuàng)建的數(shù)據(jù)表的默認(rèn)編碼,已存在的數(shù)據(jù)表編碼不會(huì)自動(dòng)同步,需單獨(dú)修改數(shù)據(jù)表編碼。
- 應(yīng)用場(chǎng)景:前期創(chuàng)建數(shù)據(jù)庫(kù)時(shí)編碼選擇錯(cuò)誤,或業(yè)務(wù)需求變更(如從 GBK 切換到 UTF8MB4)時(shí),需修改數(shù)據(jù)庫(kù)默認(rèn)編碼。
6. 刪除數(shù)據(jù)庫(kù)
語(yǔ)法:
drop database day01; drop database day02;
詳細(xì)解釋:
drop database是 “高危操作”:執(zhí)行后,數(shù)據(jù)庫(kù)及其內(nèi)部所有數(shù)據(jù)表、數(shù)據(jù)會(huì)被永久刪除,且無(wú)法通過常規(guī)方式恢復(fù)(除非有備份)。- 安全建議:
- 刪除前務(wù)必確認(rèn)數(shù)據(jù)庫(kù)名稱正確(避免誤刪系統(tǒng)庫(kù)或其他業(yè)務(wù)庫(kù));
- 重要數(shù)據(jù)庫(kù)刪除前,先執(zhí)行
mysqldump等工具備份數(shù)據(jù);- 生產(chǎn)環(huán)境中,建議限制
drop權(quán)限,僅管理員可執(zhí)行。- 應(yīng)用場(chǎng)景:清理測(cè)試庫(kù)、廢棄業(yè)務(wù)庫(kù)時(shí)使用。
7. 切換數(shù)據(jù)庫(kù)(重點(diǎn))
語(yǔ)法:
use day01;
詳細(xì)解釋:
- MySQL 是 “多數(shù)據(jù)庫(kù)” 架構(gòu),一次會(huì)話只能操作一個(gè)數(shù)據(jù)庫(kù),
use語(yǔ)句用于切換當(dāng)前會(huì)話的 “默認(rèn)數(shù)據(jù)庫(kù)”。- 執(zhí)行后,后續(xù)所有數(shù)據(jù)表操作(如創(chuàng)建、查詢)都會(huì)默認(rèn)在該數(shù)據(jù)庫(kù)下進(jìn)行,無(wú)需重復(fù)指定數(shù)據(jù)庫(kù)名。
- 注意事項(xiàng):若未切換數(shù)據(jù)庫(kù)直接操作數(shù)據(jù)表,MySQL 會(huì)拋出
1046 - No database selected錯(cuò)誤。- 替代方案:若不想切換數(shù)據(jù)庫(kù),可在操作數(shù)據(jù)表時(shí)指定 “數(shù)據(jù)庫(kù)名。表名”,如
create table day01.student (id int);。
8. 查看當(dāng)前使用的數(shù)據(jù)庫(kù)
語(yǔ)法:
select database();
詳細(xì)解釋:
- 執(zhí)行后返回當(dāng)前會(huì)話的默認(rèn)數(shù)據(jù)庫(kù)名,若未切換任何數(shù)據(jù)庫(kù),返回
NULL。- 應(yīng)用場(chǎng)景:在復(fù)雜腳本中,多次切換數(shù)據(jù)庫(kù)后,通過該語(yǔ)句確認(rèn)當(dāng)前操作的庫(kù),避免因切庫(kù)錯(cuò)誤導(dǎo)致操作錯(cuò)數(shù)據(jù)表。
二、數(shù)據(jù)表級(jí)別的 DDL 操作
數(shù)據(jù)表是存儲(chǔ)數(shù)據(jù)的核心載體,DDL 對(duì)數(shù)據(jù)表的操作圍繞 “定義表結(jié)構(gòu)” 展開,包括字段名、字段類型、約束等核心屬性的定義與修改。
1. 查看當(dāng)前數(shù)據(jù)庫(kù)的所有數(shù)據(jù)表
語(yǔ)法:
-- 先切換到目標(biāo)數(shù)據(jù)庫(kù) use day01; -- 查看所有數(shù)據(jù)表 show tables;
詳細(xì)解釋:
- 執(zhí)行
show tables前必須先切換數(shù)據(jù)庫(kù),否則無(wú)法返回有效結(jié)果;也可使用show tables from day01;直接查看指定數(shù)據(jù)庫(kù)的數(shù)據(jù)表,無(wú)需切換。- 執(zhí)行結(jié)果僅顯示數(shù)據(jù)表名,不包含表結(jié)構(gòu)信息,適用于快速確認(rèn)數(shù)據(jù)表是否存在。
2. 創(chuàng)建數(shù)據(jù)表(重點(diǎn))
語(yǔ)法:
-- 先刪除已存在的同名表(避免創(chuàng)建報(bào)錯(cuò))
drop table if exists student;
-- 創(chuàng)建學(xué)生表,包含主鍵、非空等約束
create table if not exists student(
id int primary key auto_increment, -- 主鍵(唯一性)+ 自增
name varchar(20) not null, -- 姓名,非空約束
gender varchar(10), -- 性別
age int -- 年齡
);詳細(xì)解釋:
(1)前置操作:刪除同名表
drop table if exists student;:創(chuàng)建表前先刪除已存在的同名表,避免 “表已存在” 報(bào)錯(cuò),與create database if not exists同理,是腳本健壯性的保障。
(2)核心字段定義規(guī)則
每個(gè)字段的定義格式為:字段名 數(shù)據(jù)類型 [約束條件],逐字段解析:
id int primary key auto_increment:
int:字段類型為整數(shù)(適用于存儲(chǔ)編號(hào)、數(shù)量等數(shù)值);primary key:主鍵約束,核心作用是保證字段值唯一且非空,一張表只能有一個(gè)主鍵;auto_increment:自增約束,僅適用于整數(shù)類型的主鍵,插入數(shù)據(jù)時(shí)無(wú)需手動(dòng)賦值,MySQL 會(huì)自動(dòng)生成遞增的唯一值(從 1 開始,每次 + 1)。name varchar(20) not null:
varchar(20):可變長(zhǎng)度字符串類型,20表示最大長(zhǎng)度為 20 個(gè)字符(如中文、英文均算 1 個(gè)字符),相比固定長(zhǎng)度的char更節(jié)省空間;not null:非空約束,強(qiáng)制該字段必須賦值,插入數(shù)據(jù)時(shí)若未給name賦值,MySQL 會(huì)報(bào)錯(cuò)。gender varchar(10):無(wú)約束的字符串字段,可賦值也可留空(默認(rèn)值為NULL)。age int:無(wú)約束的整數(shù)字段,可存儲(chǔ) NULL 值。
(3)約束的作用
約束是保證數(shù)據(jù)完整性的核心,上述用到的約束總結(jié):
| 約束類型 | 作用 | 適用場(chǎng)景 |
|---|---|---|
primary key | 保證字段唯一且非空 | 表的唯一標(biāo)識(shí)(如學(xué)生編號(hào)) |
auto_increment | 主鍵自動(dòng)遞增 | 整數(shù)類型主鍵 |
not null | 保證字段不能為空 | 核心業(yè)務(wù)字段(如姓名、手機(jī)號(hào)) |
3. 查看數(shù)據(jù)表詳細(xì)信息
方式 1:查看完整創(chuàng)建信息
show create table student;
詳細(xì)解釋:
- 返回?cái)?shù)據(jù)表的完整創(chuàng)建語(yǔ)句,包括表名、字段定義、字符集、存儲(chǔ)引擎(如 InnoDB)、主鍵、索引等所有屬性。
- 存儲(chǔ)引擎說明:InnoDB 是 MySQL 默認(rèn)存儲(chǔ)引擎,支持事務(wù)、外鍵、行級(jí)鎖,適用于絕大多數(shù)業(yè)務(wù)場(chǎng)景;MyISAM 不支持事務(wù),但查詢速度快,適用于只讀場(chǎng)景。
方式 2:查看字段結(jié)構(gòu)(最常用)
desc student;
詳細(xì)解釋:
desc是describe的縮寫,執(zhí)行后返回 6 列核心信息:
Field:字段名;Type:字段數(shù)據(jù)類型;Null:是否允許為空(YES表示允許,NO表示不允許);Key:是否為索引(PRI表示主鍵索引);Default:字段默認(rèn)值(未指定則為NULL);Extra:額外屬性(如auto_increment表示自增)。- 應(yīng)用場(chǎng)景:日常開發(fā)中,快速查看表的字段名、類型、約束時(shí),優(yōu)先使用
desc語(yǔ)句,比show create table更簡(jiǎn)潔。
4. 修改數(shù)據(jù)表名
語(yǔ)法:
rename table student to stu;
詳細(xì)解釋:
rename table 原表名 to 新表名:將student表重命名為stu。- 注意事項(xiàng):重命名后,原表的所有字段、數(shù)據(jù)、約束、索引均保持不變,僅表名變更;若新表名已存在,會(huì)拋出報(bào)錯(cuò),建議先執(zhí)行
show tables確認(rèn)。- 應(yīng)用場(chǎng)景:表名命名不規(guī)范(如拼寫錯(cuò)誤)、業(yè)務(wù)調(diào)整(如
student簡(jiǎn)化為stu)時(shí)使用。
5. 刪除數(shù)據(jù)表
語(yǔ)法:
drop table stu;
詳細(xì)解釋:
- 與刪除數(shù)據(jù)庫(kù)同理,
drop table是高危操作,執(zhí)行后數(shù)據(jù)表的結(jié)構(gòu)和數(shù)據(jù)會(huì)被永久刪除。- 安全寫法:
drop table if exists stu;(表存在則刪除,不存在則不操作)。- 應(yīng)用場(chǎng)景:清理測(cè)試表、廢棄數(shù)據(jù)表時(shí)使用。
三、字段級(jí)別的 DDL 操作
數(shù)據(jù)表創(chuàng)建后,業(yè)務(wù)需求變更時(shí)(如新增字段、修改字段類型),需通過 DDL 調(diào)整字段結(jié)構(gòu),這是實(shí)際開發(fā)中高頻操作。
1. 查看數(shù)據(jù)表的字段結(jié)構(gòu)
語(yǔ)法:
desc student;
詳細(xì)解釋:
- 與數(shù)據(jù)表操作中的
desc語(yǔ)句完全一致,此處重復(fù)強(qiáng)調(diào)是因?yàn)樽侄尾僮髑?,必須先確認(rèn)現(xiàn)有字段的結(jié)構(gòu),避免修改錯(cuò)誤。- 執(zhí)行結(jié)果可清晰看到字段的名稱、類型、約束,是后續(xù)字段修改的 “參考依據(jù)”。
2. 新增字段(重點(diǎn))
語(yǔ)法:
alter table student add kongfu varchar(20) not null;
詳細(xì)解釋:
- 核心語(yǔ)法:
alter table 表名 add 字段名 數(shù)據(jù)類型 [約束條件]。- 各部分解析:
alter table student:指定要修改的表為student;add kongfu:新增字段名為kongfu;varchar(20) not null:字段類型為可變長(zhǎng)度字符串(最大 20 字符),且非空。- 擴(kuò)展用法:指定字段位置,如
add kongfu varchar(20) not null after name;(將kongfu字段添加在name字段之后),默認(rèn)新增字段會(huì)放在表的最后一列。- 應(yīng)用場(chǎng)景:業(yè)務(wù)擴(kuò)展(如學(xué)生表新增 “特長(zhǎng)” 字段)時(shí)使用。
3. 修改字段類型和約束
語(yǔ)法:
alter table student modify kongfu int not null;
詳細(xì)解釋:
- 核心語(yǔ)法:
alter table 表名 modify 字段名 新數(shù)據(jù)類型 [新約束條件]。- 作用:僅修改字段的類型和約束,不修改字段名。
- 注意事項(xiàng):
- 修改字段類型時(shí),需確保現(xiàn)有數(shù)據(jù)兼容新類型(如
varchar轉(zhuǎn)int時(shí),字段值必須是純數(shù)字,否則會(huì)報(bào)錯(cuò));- 若移除
not null約束,需確保字段無(wú)空值,或先設(shè)置默認(rèn)值。- 應(yīng)用場(chǎng)景:字段類型選擇錯(cuò)誤(如本應(yīng)存儲(chǔ)數(shù)字的 “特長(zhǎng)編號(hào)” 誤設(shè)為
varchar)、約束調(diào)整(如新增非空要求)時(shí)使用。
4. 修改字段名、類型和約束(重點(diǎn))
語(yǔ)法:
alter table student change kongfu gf varchar(10) not null;
詳細(xì)解釋:
- 核心語(yǔ)法:
alter table 表名 change 原字段名 新字段名 新數(shù)據(jù)類型 [新約束條件]。- 與
modify的區(qū)別:change可同時(shí)修改字段名、類型、約束,modify僅能修改類型和約束。- 各部分解析:
change kongfu gf:將原字段名kongfu改為gf;varchar(10) not null:同時(shí)將字段類型改為varchar(10),保留非空約束。- 應(yīng)用場(chǎng)景:字段名命名不規(guī)范(如
kongfu簡(jiǎn)化為gf)+ 類型調(diào)整時(shí),一次性完成修改,比先modify再改名字更高效。
5. 刪除指定字段
語(yǔ)法:
alter table student drop gf;
詳細(xì)解釋:
- 核心語(yǔ)法:
alter table 表名 drop 字段名。- 注意事項(xiàng):
- 刪除字段會(huì)永久丟失該字段的所有數(shù)據(jù),操作前需備份;
- 若字段是主鍵、外鍵或索引,需先刪除關(guān)聯(lián)約束,再刪除字段;
- 不建議頻繁刪除字段,可通過 “邏輯刪除”(如新增
is_delete字段標(biāo)記是否刪除)替代物理刪除。- 應(yīng)用場(chǎng)景:字段廢棄(如業(yè)務(wù)調(diào)整后,“特長(zhǎng)” 字段不再使用)時(shí)使用。
四、DDL 操作核心注意事項(xiàng)
- 操作不可逆性:
drop(刪除數(shù)據(jù)庫(kù) / 表)、alter table ... drop(刪除字段)等操作會(huì)永久刪除數(shù)據(jù) / 結(jié)構(gòu),無(wú)回收站,務(wù)必先備份; - 字符集一致性:數(shù)據(jù)庫(kù)、數(shù)據(jù)表、字段的字符集建議統(tǒng)一(如全用
utf8mb4),避免因編碼不一致導(dǎo)致中文亂碼; - 約束合理性:主鍵、非空等約束需根據(jù)業(yè)務(wù)添加(如用戶表的手機(jī)號(hào)需非空 + 唯一),過度添加約束會(huì)增加插入數(shù)據(jù)的成本,缺失約束會(huì)導(dǎo)致數(shù)據(jù)混亂;
- 生產(chǎn)環(huán)境規(guī)范:生產(chǎn)環(huán)境中,執(zhí)行 DDL 前需在測(cè)試環(huán)境驗(yàn)證,避免直接操作;修改表結(jié)構(gòu)時(shí),優(yōu)先選擇業(yè)務(wù)低峰期(如凌晨),減少對(duì)業(yè)務(wù)的影響。
到此這篇關(guān)于MySQL DDL操作之?dāng)?shù)據(jù)庫(kù)、數(shù)據(jù)表、字段的文章就介紹到這了,更多相關(guān)MySQL DDL操作數(shù)據(jù)庫(kù)、數(shù)據(jù)表、字段內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL數(shù)據(jù)庫(kù)全局優(yōu)化與8.0/9.0新特性深入解析
MySQL8.0/9.0引入了多項(xiàng)重要更新,顯著增強(qiáng)了數(shù)據(jù)庫(kù)功能、性能和安全性,優(yōu)化器改進(jìn)提升了查詢效率,新增窗口函數(shù)和遞歸查詢簡(jiǎn)化了復(fù)雜操作,這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)全局優(yōu)化與8.0/9.0新特性的相關(guān)資料,需要的朋友可以參考下2026-04-04
MySQL重復(fù)數(shù)據(jù)提取最新一條技術(shù)方法詳解
在MySQL數(shù)據(jù)庫(kù)中清除重復(fù)數(shù)據(jù)是一項(xiàng)常見的任務(wù),下面這篇文章主要給大家介紹了關(guān)于MySQL重復(fù)數(shù)據(jù)提取最新一條的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07
MySQL中Decimal類型和Float Double的區(qū)別(詳解)
下面小編就為大家?guī)?lái)一篇MySQL中Decimal類型和Float Double的區(qū)別(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2017-03-03
mysql遠(yuǎn)程登錄root賬戶報(bào)錯(cuò)1045的解決
這篇文章主要介紹了mysql遠(yuǎn)程登錄root賬戶報(bào)錯(cuò)1045的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04

