💜 想真正擅长编程? 从一门课程开始,100% 免费

2-4、数据库初始化与SQL脚本导入

项目代码有了,配置改了,但数据库还是空的。没有表和数据,项目跑起来也查询不到东西。这一节讲数据库初始化和SQL脚本导入。


一、找SQL脚本

公司项目的SQL脚本一般在这几个地方:

1. 项目代码里

TEXT
项目根目录/
  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的数据库名:

YAML
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/my_project?...

数据库名就是my_project。

2. 创建数据库

用Navicat/DBeaver连接MySQL,或者命令行:

Shell
mysql -u root -p
SQL
-- 创建数据库
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:命令行导入

Shell
# 方式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导入

  1. 连接MySQL → 双击my_project数据库(变绿说明选中了)
  2. 右键数据库 → 运行SQL文件
  3. 选择SQL文件 → 点开始
  4. 等执行完毕,查看日志有没有报错

方法3:DBeaver导入

  1. 连接MySQL → 展开数据库
  2. 右键数据库 → SQL编辑器 → 新建SQL编辑器
  3. 打开SQL文件,全选 → 执行(Alt+X)

方法4:IDEA导入

  1. IDEA右侧Database面板 → 连接MySQL
  2. 右键数据库 → Jump to Query Console
  3. 把SQL文件内容粘贴进去 → 执行

四、SQL脚本执行顺序

有些项目有多个SQL文件,顺序不能错:

TEXT
1. init.sql          → 先建库建表
2. data.sql          → 再插入初始数据
3. update_xxx.sql    → 按版本号顺序执行更新脚本

一般README里会写执行顺序。 没有的话按文件名排序,编号小的先执行。

如果脚本之间有依赖

比如data.sql引用了init.sql建的表,那就必须先执行init.sql。


五、验证数据库初始化结果

1. 检查表是否创建成功

SQL
-- 查看所有表
SHOW TABLES;

-- 查看表结构
DESC user;
-- 或
SHOW CREATE TABLE user;

2. 检查数据是否导入成功

SQL
-- 查看每张表的记录数
SELECT COUNT(*) FROM user;
SELECT COUNT(*) FROM role;
SELECT COUNT(*) FROM menu;

-- 查看数据内容
SELECT * FROM user LIMIT 10;

3. 检查表字符集

SQL
-- 查看所有表的字符集
SELECT TABLE_NAME, TABLE_COLLATION 
FROM information_schema.TABLES 
WHERE TABLE_SCHEMA = 'my_project';

如果发现表字符集不是utf8mb4,需要修改:

SQL
-- 修改表字符集
ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

六、常见问题

问题1:SQL脚本执行报错

报错1:Table already exists

SQL
ERROR 1050 (42S01): Table 'user' already exists

表已存在。如果脚本开头有DROP TABLE IF EXISTS就不用管,如果没有,手动删表再执行:

SQL
DROP TABLE IF EXISTS user;

报错2:Unknown column

SQL
ERROR 1054 (42S22): Unknown column 'xxx' in 'field list'

列不存在。可能是SQL脚本版本和代码不匹配,问同事要最新版脚本。

报错3:Access denied

SQL
ERROR 1044 (42000): Access denied for user 'root'@'%' to database 'my_project'

用户没有操作这个数据库的权限。

SQL
-- 给用户授权
GRANT ALL PRIVILEGES ON my_project.* TO 'root'@'%';
FLUSH PRIVILEGES;

报错4:Data too long for column

SQL
ERROR 1406 (22001): Data too long for column 'name' at row 1

数据超过列长度限制。检查数据是不是有超长字符串,或者修改列定义:

SQL
ALTER TABLE user MODIFY COLUMN name VARCHAR(255);

问题2:中文乱码

导入数据后中文显示为???或乱码。

原因: 数据库或表的字符集不对。

解决:

  1. 确认数据库字符集是utf8mb4
  2. 确认SQL文件编码是UTF-8(用记事本打开另存为UTF-8)
  3. 导入时指定字符集:
Shell
mysql -u root -p --default-character-set=utf8mb4 my_project < init.sql

问题3:外键约束报错

SQL
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails

有外键约束的表数据依赖其他表,导入顺序不对。

解决: 先关掉外键检查,导入后再开:

SQL
-- 关闭外键检查
SET FOREIGN_KEY_CHECKS = 0;

-- 执行你的SQL
SOURCE init.sql;

-- 开启外键检查
SET FOREIGN_KEY_CHECKS = 1;

问题4:字段名是MySQL关键字

SQL
ERROR 1064 (42000): You have an error in your SQL syntax

有些列名和MySQL关键字冲突(如order、group、key、desc、level)。

在列名上加反引号:

SQL
INSERT INTO user (`order`, `level`) VALUES (1, 10);

问题5:SQL文件太大导入不了

有些SQL文件几百MB,Navicat或命令行导入超时。

用source命令导入:

Shell
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文件:

TEXT
V1__init.sql
V2__add_user_table.sql
V3__add_user_phone_column.sql

项目启动时Flyway会自动按版本号顺序执行这些脚本。

你只需要:

  1. 确保数据库已创建
  2. 启动项目,Flyway自动执行迁移
  3. 看flyway_schema_history表确认执行了哪些版本

Liquibase

类似Flyway,用XML或YML管理数据库变更。

TEXT
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项目。