MySQL 數(shù)據(jù)庫(kù)表創(chuàng)建過(guò)程
MySQL 數(shù)據(jù)庫(kù)表創(chuàng)建詳解
一、核心語(yǔ)法結(jié)構(gòu)
CREATE TABLE [IF NOT EXISTS] table_name ( column1 datatype [column_constraints], column2 datatype [column_constraints], ... [table_constraints] ) [ENGINE = storage_engine] [DEFAULT] CHARACTER SET charset_name [COLLATE collation_name] [COMMENT 'table_comment'];
參數(shù)說(shuō)明:
IF NOT EXISTS
:可選,避免表已存在時(shí)報(bào)錯(cuò)table_name
:表名,遵循命名規(guī)范(建議小寫+下劃線)column_constraints
:字段級(jí)約束(如NOT NULL、DEFAULT等)table_constraints
:表級(jí)約束(如PRIMARY KEY、FOREIGN KEY等)storage_engine
:指定存儲(chǔ)引擎(如InnoDB、MyISAM)charset_name
:字符集(推薦utf8mb4支持emoji)collation_name
:排序規(guī)則(影響字符串比較)table_comment
:表注釋,強(qiáng)烈建議添加
二、關(guān)鍵組件解析
字段定義 (field)
column_name datatype [NOT NULL] [DEFAULT value] [AUTO_INCREMENT] [UNIQUE] [PRIMARY KEY] [COMMENT 'string']
詳細(xì)規(guī)則:
命名規(guī)則:
- 允許字符:字母(a-z)、數(shù)字(0-9)、美元符($)、下劃線(_)
- 長(zhǎng)度限制:不超過(guò)64個(gè)字符
- 避免使用:MySQL保留字(如SELECT、WHERE)
- 命名風(fēng)格:建議全小寫+下劃線(user_name)
完整示例:
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '主鍵ID', username VARCHAR(30) NOT NULL UNIQUE COMMENT '用戶名', status TINYINT(1) DEFAULT 1 COMMENT '狀態(tài):1啟用0禁用', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時(shí)間'
數(shù)據(jù)類型 (datatype)
類別 | 常用類型 | 說(shuō)明 |
---|---|---|
整數(shù) | INT, TINYINT, BIGINT | 可選UNSIGNED(無(wú)符號(hào)整數(shù)),如TINYINT UNSIGNED 范圍0-255 |
浮點(diǎn)數(shù) | FLOAT, DOUBLE, DECIMAL | DECIMAL(10,2)固定精度,適合金額存儲(chǔ) |
字符串 | VARCHAR(255), CHAR(1) | VARCHAR按需分配空間,CHAR固定長(zhǎng)度 |
日期 | DATE, DATETIME, TIMESTAMP | TIMESTAMP自動(dòng)時(shí)區(qū)轉(zhuǎn)換(1970-2038年),DATETIME支持更大范圍 |
大文本 | TEXT, LONGTEXT | TEXT約64KB,LONGTEXT約4GB,適合存儲(chǔ)JSON/HTML內(nèi)容 |
二進(jìn)制 | BLOB, LONGBLOB | 通常只存儲(chǔ)文件路徑而非實(shí)際二進(jìn)制數(shù)據(jù) |
選型建議:
- 狀態(tài)字段:TINYINT
- 用戶ID:INT UNSIGNED或BIGINT UNSIGNED
- 用戶名:VARCHAR(20-50)
- 密碼哈希:CHAR(60)(適合Bcrypt固定長(zhǎng)度哈希值)
- 金額:DECIMAL(10,2)
- 文章內(nèi)容:LONGTEXT
字符集與校對(duì)規(guī)則
優(yōu)先級(jí)順序:字段級(jí) > 表級(jí) > 數(shù)據(jù)庫(kù)級(jí) > 服務(wù)器級(jí)
推薦設(shè)置:
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
字符集對(duì)比:
- utf8:基本多語(yǔ)言平面(3字節(jié)/字符)
- utf8mb4:完整Unicode(4字節(jié)/字符),支持emoji表情
常用校對(duì)規(guī)則:
- utf8mb4_general_ci:簡(jiǎn)單排序規(guī)則
- utf8mb4_unicode_ci:準(zhǔn)確Unicode排序(推薦)
- utf8mb4_bin:二進(jìn)制比較(區(qū)分大小寫)
存儲(chǔ)引擎 (ENGINE)
引擎 | 關(guān)鍵特性 | 適用場(chǎng)景 |
---|---|---|
InnoDB | 事務(wù)支持、行級(jí)鎖、外鍵約束 | 交易系統(tǒng)、需要ACID特性的表(默認(rèn)) |
MyISAM | 表級(jí)鎖、全文索引、高讀取性能 | 數(shù)據(jù)倉(cāng)庫(kù)、日志表(MySQL 5.7前) |
MEMORY | 內(nèi)存存儲(chǔ)、極速訪問(wèn)、重啟數(shù)據(jù)丟失 | 臨時(shí)會(huì)話表、高速緩存 |
Archive | 高壓縮比(約10:1)、只支持INSERT/SELECT | 歷史歸檔數(shù)據(jù) |
遷移引擎示例:
ALTER TABLE logs ENGINE=Archive;
三、完整創(chuàng)建示例
CREATE TABLE IF NOT EXISTS `users` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '用戶ID', `username` VARCHAR(50) NOT NULL COMMENT '用戶名', `password` CHAR(60) NOT NULL COMMENT 'Bcrypt加密密碼', -- 固定60字符長(zhǎng)度 `email` VARCHAR(100) NOT NULL UNIQUE COMMENT '郵箱', `phone` VARCHAR(20) NULL COMMENT '手機(jī)號(hào)', `birthday` DATE NULL COMMENT '出生日期', `gender` ENUM('M','F','O') NULL COMMENT '性別:M男,F女,O其他', `balance` DECIMAL(10,2) UNSIGNED DEFAULT 0.00 COMMENT '賬戶余額', `status` TINYINT(1) UNSIGNED DEFAULT 1 COMMENT '狀態(tài):1正常0凍結(jié)', `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時(shí)間', `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時(shí)間', PRIMARY KEY (`id`), UNIQUE KEY `uniq_username` (`username`), -- 唯一約束 INDEX `idx_email` (`email`(20)), -- 前綴索引 INDEX `idx_phone` (`phone`), -- 普通索引 INDEX `idx_status` (`status`) -- 低基數(shù)索引 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='平臺(tái)用戶信息表';
設(shè)計(jì)要點(diǎn):
- 主鍵自增INT/BIGINT
- 密碼使用固定長(zhǎng)度CHAR存儲(chǔ)哈希值
- 金額使用DECIMAL避免精度問(wèn)題
- 枚舉字段使用ENUM限定值范圍
- 自動(dòng)管理時(shí)間戳字段
- 為高頻查詢字段創(chuàng)建索引
四、字段約束詳解
約束類型 | 語(yǔ)法示例 | 作用說(shuō)明 |
---|---|---|
主鍵約束 | PRIMARY KEY (id) | 唯一標(biāo)識(shí)記錄,自動(dòng)創(chuàng)建聚集索引,InnoDB表必須包含主鍵 |
唯一約束 | UNIQUE KEY (email) | 保證列值唯一性,允許NULL值 |
非空約束 | NOT NULL | 插入時(shí)必須提供值,與DEFAULT配合使用 |
默認(rèn)值 | DEFAULT 0 | 未顯式指定值時(shí)自動(dòng)填充 |
自增長(zhǎng) | AUTO_INCREMENT | 整數(shù)列自動(dòng)遞增(通常用于主鍵),注意并發(fā)問(wèn)題 |
外鍵約束 | FOREIGN KEY (dept_id) REFERENCES departments(id) | 確保引用完整性,InnoDB支持 |
檢查約束 | CHECK (age > 0) | MySQL 8.0+支持的自定義驗(yàn)證條件 |
外鍵高級(jí)用法:
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE -- 級(jí)聯(lián)刪除 ON UPDATE SET NULL -- 引用更新時(shí)置空
五、表操作命令
查看表結(jié)構(gòu)
-- 基礎(chǔ)結(jié)構(gòu) DESC users; -- 完整建表語(yǔ)句(含所有選項(xiàng)) SHOW CREATE TABLE users; -- 查看表信息 SHOW TABLE STATUS LIKE 'users';
修改表結(jié)構(gòu)
-- 添加字段 ALTER TABLE users ADD COLUMN wechat VARCHAR(30) NULL COMMENT '微信號(hào)' AFTER phone, ADD COLUMN last_login DATETIME NULL COMMENT '最后登錄時(shí)間'; -- 修改字段 ALTER TABLE users MODIFY COLUMN email VARCHAR(150) NOT NULL COMMENT '電子郵箱', CHANGE COLUMN phone mobile VARCHAR(20) NULL COMMENT '手機(jī)號(hào)碼'; -- 刪除字段 ALTER TABLE users DROP COLUMN obsolete_field; -- 添加索引 ALTER TABLE users ADD INDEX idx_wechat (wechat), ADD FULLTEXT INDEX ft_idx_username (username);
刪除表
-- 安全刪除(表不存在時(shí)不報(bào)錯(cuò)) DROP TABLE IF EXISTS temp_users; -- 清空表數(shù)據(jù) TRUNCATE TABLE user_logs; -- 比DELETE更快且重置自增值
六、最佳實(shí)踐建議
命名規(guī)范
表名:
- 使用小寫字母+下劃線(snake_case)
- 多對(duì)多關(guān)系表用
relation1_relation2
格式(如user_roles
)
字段名:
- 避免使用數(shù)據(jù)類型作為名稱(如
text_value
) - 布爾字段用
is_
前綴(is_active
)
- 避免使用數(shù)據(jù)類型作為名稱(如
字段設(shè)計(jì)原則
數(shù)據(jù)類型優(yōu)化:
- IP地址:建議VARCHAR(45)(兼容IPv6)
- 固定長(zhǎng)度代碼:CHAR(2)(如國(guó)家代碼)
- JSON數(shù)據(jù):MySQL 5.7+直接使用JSON類型
特殊場(chǎng)景處理:
-- 軟刪除設(shè)計(jì) ADD COLUMN is_deleted TINYINT(1) DEFAULT 0 COMMENT '是否刪除', ADD COLUMN deleted_at TIMESTAMP NULL COMMENT '刪除時(shí)間'; -- 樹形結(jié)構(gòu) ADD COLUMN parent_id INT UNSIGNED NULL COMMENT '父節(jié)點(diǎn)ID', ADD COLUMN tree_path VARCHAR(255) NULL COMMENT '路徑:1,5,22';
索引優(yōu)化
-- 聯(lián)合索引(注意順序) CREATE INDEX idx_name_phone ON customers(last_name, first_name, phone); -- 前綴索引(長(zhǎng)文本字段) CREATE INDEX idx_product_desc ON products(description(20)); -- 覆蓋索引優(yōu)化 ALTER TABLE orders ADD INDEX idx_cover_user (user_id, status, create_time);
字符集統(tǒng)一
-- 創(chuàng)建數(shù)據(jù)庫(kù)時(shí)指定 CREATE DATABASE myapp DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 修改已有表字符集 ALTER TABLE products CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
七、存儲(chǔ)引擎選擇指南
生產(chǎn)環(huán)境建議:
- 默認(rèn)使用InnoDB引擎
- 日志類表可考慮Archive引擎(如操作日志)
- 避免使用MyISAM(崩潰后易損壞且修復(fù)慢)
關(guān)鍵注意事項(xiàng):
- 每個(gè)表必須包含主鍵(推薦自增INT/BIGINT)
- 時(shí)間字段使用TIMESTAMP自動(dòng)管理(或DATETIME)
- 為所有字段添加COMMENT注釋
- 避免使用ENUM類型(改用關(guān)聯(lián)表或CHECK約束)
- 大字段(如TEXT/BLOB)單獨(dú)建表存儲(chǔ)
到此這篇關(guān)于MySQL 數(shù)據(jù)庫(kù)表創(chuàng)建的文章就介紹到這了,更多相關(guān)mysql數(shù)據(jù)庫(kù)表創(chuàng)建內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- DBeaver連接本地MySQL并創(chuàng)建數(shù)據(jù)庫(kù)/表的基礎(chǔ)操作教程
- MySQL創(chuàng)建數(shù)據(jù)庫(kù)和創(chuàng)建數(shù)據(jù)表
- MySQL創(chuàng)建數(shù)據(jù)庫(kù)和創(chuàng)建數(shù)據(jù)表的操作過(guò)程
- mysql數(shù)據(jù)庫(kù)入門第一步之創(chuàng)建表
- PHP使用PDO創(chuàng)建MySQL數(shù)據(jù)庫(kù)、表及插入多條數(shù)據(jù)操作示例
- mysql中數(shù)據(jù)庫(kù)與數(shù)據(jù)表編碼格式的查看、創(chuàng)建及修改
- 用MySQL創(chuàng)建數(shù)據(jù)庫(kù)和數(shù)據(jù)庫(kù)表代碼
相關(guān)文章
MySQL系列之五 視圖、存儲(chǔ)函數(shù)、存儲(chǔ)過(guò)程、觸發(fā)器
視圖就是一條select語(yǔ)句執(zhí)行后返回的結(jié)果集;觸發(fā)器是與表有關(guān)的數(shù)據(jù)庫(kù)對(duì)象,在滿足定義條件時(shí)觸發(fā),并執(zhí)行觸發(fā)器中定義的語(yǔ)句集合;函數(shù)存儲(chǔ)著一系列sql語(yǔ)句,調(diào)用函數(shù)就是一次性執(zhí)行這些語(yǔ)句,而存儲(chǔ)過(guò)程就是一組可編程的函數(shù),需要的朋友可以參考下2021-07-07Mysql?索引?BTree?與?B+Tree?的區(qū)別(面試)
這篇文章主要介紹了Mysql索引BTree與B+Tree的區(qū)別,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09MySQL數(shù)據(jù)庫(kù)遷移全過(guò)程
本文詳細(xì)解析了MySQL數(shù)據(jù)庫(kù)遷移的整個(gè)過(guò)程,包括準(zhǔn)備工作、遷移方法、注意事項(xiàng)和優(yōu)缺點(diǎn),文章介紹了三種常見(jiàn)的遷移方法:使用mysqldump導(dǎo)出和導(dǎo)入、使用ibd文件遷移和使用目錄整體遷移,每種方法都有其優(yōu)缺點(diǎn),選擇合適的方法取決于具體的遷移需求和環(huán)境2025-02-02關(guān)于MySQL innodb_autoinc_lock_mode介紹
下面小編就為大家?guī)?lái)一篇關(guān)于MySQL innodb_autoinc_lock_mode介紹。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03