项目代码有了,配置改了,但数据库还是空的。没有表和数据,项目跑起来也查询不到东西。这一节讲数据库初始化和SQL脚本导入。
一、找SQL脚本
公司项目的SQL脚本一般在这几个地方:
1. 项目代码里
项目根目录/
sql/
init.sql (建库建表脚本)
data.sql (初始数据)
update_v1.1.sql (版本更新脚本)
doc/
database.sql
src/main/resources/
sql/
init.sql
先在项目里找有没有sql目录或者.sql文件。
2. 项目文档里
看项目根目录的README.md、INSTALL.md、docs/目录里有没有数据库初始化说明。
3. 问同事要
如果项目里没有SQL脚本:
- 问你的导师:"这个项目的初始化SQL在哪里?"
- 有些公司的数据库脚本在wiki/文档系统上
- 有些公司有专门的DBA维护数据库
二、创建数据库
1. 确认数据库名
看配置文件里数据库URL的数据库名:
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/my_project?...
数据库名就是my_project。
2. 创建数据库
用Navicat/DBeaver连接MySQL,或者命令行:
mysql -u root -p
-- 创建数据库
CREATE DATABASE IF NOT EXISTS my_project
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;
-- 确认创建成功
SHOW DATABASES;
-- 使用这个数据库
USE my_project;
字符集一定要用utf8mb4,别用utf8。 MySQL的utf8是阉割版,最多3字节,存不了emoji和部分生僻字。
三、导入SQL脚本
方法1:命令行导入
# 方式1:在数据库外部执行
mysql -u root -p my_project < D:/projects/sql/init.sql
# 方式2:先登录再执行
mysql -u root -p
USE my_project;
SOURCE D:/projects/sql/init.sql;
注意路径用正斜杠/,Windows的D:\在MySQL里可能被转义。
方法2:Navicat导入
- 连接MySQL → 双击
my_project数据库(变绿说明选中了) - 右键数据库 → 运行SQL文件
- 选择SQL文件 → 点开始
- 等执行完毕,查看日志有没有报错
方法3:DBeaver导入
- 连接MySQL → 展开数据库
- 右键数据库 → SQL编辑器 → 新建SQL编辑器
- 打开SQL文件,全选 → 执行(Alt+X)
方法4:IDEA导入
- IDEA右侧Database面板 → 连接MySQL
- 右键数据库 → Jump to Query Console
- 把SQL文件内容粘贴进去 → 执行
四、SQL脚本执行顺序
有些项目有多个SQL文件,顺序不能错:
1. init.sql → 先建库建表
2. data.sql → 再插入初始数据
3. update_xxx.sql → 按版本号顺序执行更新脚本
一般README里会写执行顺序。 没有的话按文件名排序,编号小的先执行。
如果脚本之间有依赖
比如data.sql引用了init.sql建的表,那就必须先执行init.sql。
五、验证数据库初始化结果
1. 检查表是否创建成功
-- 查看所有表
SHOW TABLES;
-- 查看表结构
DESC user;
-- 或
SHOW CREATE TABLE user;
2. 检查数据是否导入成功
-- 查看每张表的记录数
SELECT COUNT(*) FROM user;
SELECT COUNT(*) FROM role;
SELECT COUNT(*) FROM menu;
-- 查看数据内容
SELECT * FROM user LIMIT 10;
3. 检查表字符集
-- 查看所有表的字符集
SELECT TABLE_NAME, TABLE_COLLATION
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'my_project';
如果发现表字符集不是utf8mb4,需要修改:
-- 修改表字符集
ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
六、常见问题
问题1:SQL脚本执行报错
报错1:Table already exists
ERROR 1050 (42S01): Table 'user' already exists
表已存在。如果脚本开头有DROP TABLE IF EXISTS就不用管,如果没有,手动删表再执行:
DROP TABLE IF EXISTS user;
报错2:Unknown column
ERROR 1054 (42S22): Unknown column 'xxx' in 'field list'
列不存在。可能是SQL脚本版本和代码不匹配,问同事要最新版脚本。
报错3:Access denied
ERROR 1044 (42000): Access denied for user 'root'@'%' to database 'my_project'
用户没有操作这个数据库的权限。
-- 给用户授权
GRANT ALL PRIVILEGES ON my_project.* TO 'root'@'%';
FLUSH PRIVILEGES;
报错4:Data too long for column
ERROR 1406 (22001): Data too long for column 'name' at row 1
数据超过列长度限制。检查数据是不是有超长字符串,或者修改列定义:
ALTER TABLE user MODIFY COLUMN name VARCHAR(255);
问题2:中文乱码
导入数据后中文显示为???或乱码。
原因: 数据库或表的字符集不对。
解决:
- 确认数据库字符集是
utf8mb4 - 确认SQL文件编码是UTF-8(用记事本打开另存为UTF-8)
- 导入时指定字符集:
mysql -u root -p --default-character-set=utf8mb4 my_project < init.sql
问题3:外键约束报错
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails
有外键约束的表数据依赖其他表,导入顺序不对。
解决: 先关掉外键检查,导入后再开:
-- 关闭外键检查
SET FOREIGN_KEY_CHECKS = 0;
-- 执行你的SQL
SOURCE init.sql;
-- 开启外键检查
SET FOREIGN_KEY_CHECKS = 1;
问题4:字段名是MySQL关键字
ERROR 1064 (42000): You have an error in your SQL syntax
有些列名和MySQL关键字冲突(如order、group、key、desc、level)。
在列名上加反引号:
INSERT INTO user (`order`, `level`) VALUES (1, 10);
问题5:SQL文件太大导入不了
有些SQL文件几百MB,Navicat或命令行导入超时。
用source命令导入:
mysql -u root -p
USE my_project;
SET autocommit = 0;
SET unique_checks = 0;
SET foreign_key_checks = 0;
SOURCE D:/projects/sql/big_data.sql;
COMMIT;
SET unique_checks = 1;
SET foreign_key_checks = 1;
关闭自动提交和检查后导入速度大幅提升。
七、数据库版本管理(Flyway/Liquibase)
有些项目用Flyway或Liquibase管理数据库版本,不需要手动执行SQL。
Flyway
项目src/main/resources/db/migration/目录下有版本化的SQL文件:
V1__init.sql
V2__add_user_table.sql
V3__add_user_phone_column.sql
项目启动时Flyway会自动按版本号顺序执行这些脚本。
你只需要:
- 确保数据库已创建
- 启动项目,Flyway自动执行迁移
- 看
flyway_schema_history表确认执行了哪些版本
Liquibase
类似Flyway,用XML或YML管理数据库变更。
src/main/resources/db/changelog/
db.changelog-master.xml
db.changelog-1.0.xml
启动时自动执行。
如果项目用了这些工具
你不需要手动导SQL,直接启动项目,数据库表会自动创建。
但前提是配置文件里的数据库连接信息正确。
八、导入后的检查清单
执行完SQL后,确认以下几点:
| 检查项 | 命令 | 预期结果 |
|---|---|---|
| 数据库存在 | SHOW DATABASES; |
能看到数据库名 |
| 表已创建 | SHOW TABLES; |
能看到所有表 |
| 表结构正确 | DESC user; |
字段和预期一致 |
| 初始数据存在 | SELECT COUNT(*) FROM user; |
有数据 |
| 字符集正确 | SHOW CREATE TABLE user; |
utf8mb4 |
| 外键约束正确 | SELECT * FROM information_schema.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA='my_project'; |
外键关系正确 |
小结
| 步骤 | 关键点 |
|---|---|
| 找SQL脚本 | 项目sql目录或问同事 |
| 建库 | 字符集用utf8mb4 |
| 导入脚本 | 命令行或图形化工具 |
| 验证 | 表和数据都在 |
| Flyway/Liquibase | 自动管理,不用手动导 |
数据库准备好了,下一步启动SpringBoot项目。