学会创建、修改和删除数据库与表,掌握 MySQL 数据类型和约束。
CREATE DATABASE testdb;
CREATE DATABASE testdb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
SHOW DATABASES;
USE testdb;
SELECT DATABASE();
SHOW CREATE DATABASE testdb;
ALTER DATABASE testdb CHARACTER SET utf8mb4;
DROP DATABASE testdb;
DROP DATABASE IF EXISTS testdb;
| 字符集 | 说明 | 推荐 |
|---|
utf8 | 每个字符最多 3 字节 | ❌ 不支持 emoji |
utf8mb4 | 每个字符最多 4 字节 | ✅ 推荐(支持 emoji) |
latin1 | 每个字符 1 字节 | ❌ 只支持西欧字符 |
SHOW CHARSET;
SHOW VARIABLES LIKE 'character_set_database';
| 类型 | 占用 | 范围 |
|---|
TINYINT | 1 字节 | -128 ~ 127 |
SMALLINT | 2 字节 | -32768 ~ 32767 |
MEDIUMINT | 3 字节 | -838万 ~ 838万 |
INT | 4 字节 | -21亿 ~ 21亿 |
BIGINT | 8 字节 | -922亿亿 ~ 922亿亿 |
age TINYINT UNSIGNED
id INT(5) ZEROFILL
| 类型 | 说明 |
|---|
FLOAT | 单精度浮点,约 7 位精度 |
DOUBLE | 双精度浮点,约 15 位精度 |
DECIMAL(M,D) | 精确小数,M 总位数,D 小数位数 |
| 类型 | 说明 | 最大长度 |
|---|
CHAR(N) | 定长字符串 | 255 |
VARCHAR(N) | 变长字符串 | 65535 |
TINYTEXT | 短文本 | 255 |
TEXT | 文本 | 65535 |
MEDIUMTEXT | 中等文本 | 1677万 |
LONGTEXT | 长文本 | 42亿 |
gender CHAR(1)
status CHAR(2)
username VARCHAR(50)
email VARCHAR(100)
content TEXT
description LONGTEXT
提示
CHAR 和 VARCHAR 的选择:如果字段长度固定(如 MD5 密码 32 位),用 CHAR 性能更好;如果变化较大(如用户名),用 VARCHAR 节省空间。
| 类型 | 格式 | 说明 |
|---|
DATE | 2024-01-15 | 日期 |
TIME | 14:30:25 | 时间 |
DATETIME | 2024-01-15 14:30:25 | 日期+时间 |
TIMESTAMP | 2024-01-15 14:30:25 | 时间戳(受时区影响) |
YEAR | 2024 | 年份 |
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
is_active BOOLEAN DEFAULT TRUE
attributes JSON
status ENUM('pending', 'active', 'banned')
photo BLOB
CREATE TABLE IF NOT EXISTS users (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY COMMENT '主键',
username VARCHAR(50) NOT NULL COMMENT '用户名',
email VARCHAR(100) NOT NULL UNIQUE COMMENT '邮箱',
password VARCHAR(255) NOT NULL COMMENT '密码',
age TINYINT UNSIGNED DEFAULT 0 COMMENT '年龄',
gender CHAR(1) DEFAULT '' COMMENT '性别',
status ENUM('active', 'inactive') DEFAULT 'active' COMMENT '状态',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX idx_username (username),
INDEX idx_email (email)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
SHOW TABLES;
DESC users;
DESCRIBE users;
SHOW CREATE TABLE users;
SHOW FULL COLUMNS FROM users;
ALTER TABLE users ADD COLUMN phone VARCHAR(20) AFTER email;
ALTER TABLE users MODIFY COLUMN phone VARCHAR(30);
ALTER TABLE users CHANGE COLUMN phone mobile VARCHAR(20);
ALTER TABLE users DROP COLUMN mobile;
ALTER TABLE users RENAME TO members;
RENAME TABLE members TO users;
DROP TABLE users;
DROP TABLE IF EXISTS users;
TRUNCATE TABLE users;
DELETE FROM users;
| 约束 | 说明 | 示例 |
|---|
PRIMARY KEY | 主键(唯一+非空) | id INT PRIMARY KEY |
FOREIGN KEY | 外键 | FOREIGN KEY (class_id) REFERENCES classes(id) |
UNIQUE | 唯一 | email VARCHAR(100) UNIQUE |
NOT NULL | 非空 | username VARCHAR(50) NOT NULL |
DEFAULT | 默认值 | age INT DEFAULT 0 |
CHECK | 条件检查(8.0+) | age INT CHECK (age >= 0) |
id INT AUTO_INCREMENT PRIMARY KEY
CREATE TABLE order_items (
order_id INT,
product_id INT,
quantity INT,
PRIMARY KEY (order_id, product_id)
);
class_id INT,
FOREIGN KEY (class_id) REFERENCES classes(id)
ON DELETE CASCADE
ON UPDATE CASCADE
score DECIMAL(5,2) CHECK (score >= 0 AND score <= 100)
| 特性 | InnoDB(默认) | MyISAM |
|---|
| 事务 | ✅ | ❌ |
| 外键 | ✅ | ❌ |
| 行级锁 | ✅ | ❌(表级锁) |
| 全文索引 | ✅ (5.6+) | ✅ |
| 崩溃恢复 | ✅ | ❌ |
| 推荐 | 所有场景 | 只读表(已很少用) |
SHOW ENGINES;
CREATE TABLE my_table (
id INT PRIMARY KEY
) ENGINE=MyISAM;
ALTER TABLE my_table ENGINE=InnoDB;