2023-05-05 12:54:57
在 MySQL 中创建表并插入数据的完整流程可分为建表和插数两个核心步骤,结合数据类型匹配、约束检查和性能优化等关键细节,具体操作如下:
一、建表阶段核心语法使用 CREATE TABLE 语句定义表名、字段、数据类型及约束条件,示例模板如下:
CREATE TABLE IF NOT EXISTS `users` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `username` VARCHAR(50) NOT NULL, `email` VARCHAR(100) NOT NULL, `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`), UNIQUE KEY `email` (`email`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;字段设计要点:
id:自增主键,确保每条记录唯一标识。
username 和 email:设为 UNIQUE KEY,避免重复数据。
created_at:默认值为当前时间戳,自动记录插入时间。
存储引擎与字符集:
ENGINE=InnoDB:支持事务和行级锁,适合高并发场景。
DEFAULT CHARSET=utf8mb4:支持完整的 Unicode 字符(如表情符号)。
常见约束类型
NOT NULL:字段不允许为空。
DEFAULT:设置默认值(如 DEFAULT CURRENT_TIMESTAMP)。
CHECK:自定义条件约束(如 CHECK (age >= 18))。
FOREIGN KEY:外键关联其他表(需确保关联表已存在)。
单条插入使用 INSERT INTO 指定字段名和对应值,示例:
INSERT INTO `users` (`username`, `email`) VALUES ('john_doe', 'john@example.com');自动生成字段:
id:因设为 AUTO_INCREMENT,无需手动赋值。
created_at:默认填充当前时间戳。
字段顺序:若省略字段名,需按表定义顺序提供所有非空字段的值。
批量插入通过单条语句插入多行数据,提升效率:
INSERT INTO `users` (`username`, `email`) VALUES ('alice', 'alice@example.com'), ('bob', 'bob@example.com'), ('charlie', 'charlie@example.com');性能优势:减少与数据库的交互次数,适合初始化或迁移数据。
从文件导入使用 LOAD DATA INFILE 快速导入大量数据(需文件权限):
LOAD DATA INFILE '/path/to/users.csv' INTO TABLE `users` FIELDS TERMINATED BY ',' LINES TERMINATED BY 'n' (`username`, `email`);文件格式:需与表结构匹配,支持 CSV、TSV 等。
安全限制:默认禁止加载远程文件,需通过 LOCAL 关键字或配置 secure_file_priv。
数据类型匹配
插入值必须与字段类型兼容,例如:
向 INT 字段插入字符串会导致错误。
向 VARCHAR(50) 插入超长字符串会被截断。
唯一性约束检查
插入重复的 username 或 email 会触发错误:ERROR 1062 (23000): Duplicate entry 'john_doe' for key 'username'
解决方案:先查询是否存在,或使用 INSERT IGNORE 跳过重复项。
事务管理
批量操作时建议使用事务确保原子性:START TRANSACTION;INSERT INTO `users` (...) VALUES (...);INSERT INTO `logs` (...) VALUES (...);COMMIT; -- 或 ROLLBACK 回滚
索引优化
在频繁查询的字段(如 email)上建立索引,但避免过度索引:CREATE INDEX idx_email ON `users` (`email`);
索引类型选择:
B-Tree:适合等值查询和范围查询。
Hash:仅适合等值查询(如内存表)。
数据规范化
拆分大表为关联表(如将用户地址拆分到单独表),减少冗余。
使用外键维护引用完整性:CREATE TABLE `orders` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `user_id` INT NOT NULL, FOREIGN KEY (`user_id`) REFERENCES `users` (`id`));
批量操作替代循环
避免在应用层循环插入,优先使用 SQL 批量语法或存储过程。
建表
CREATE TABLE `products` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(100) NOT NULL, `price` DECIMAL(10,2) NOT NULL, `stock` INT DEFAULT 0, `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP);插数
INSERT INTO `products` (`name`, `price`, `stock`) VALUES ('Laptop', 999.99, 10), ('Smartphone', 699.99, 20);查询验证
SELECT * FROM `products`;通过以上流程,可系统化完成 MySQL 的表创建与数据插入,同时兼顾数据完整性和操作效率。