Beekeeper Studio 仓库中的 Sakila 样本数据库:MySQL 版本兼容的派生与落地实践
【免费下载链接】beekeeper-studioModern and easy to use SQL client for MySQL, Postgres, SQLite, SQL Server, and more. Linux, MacOS, and Windows.项目地址: https://gitcode.com/GitHub_Trending/be/beekeeper-studio
Sakila 是 MySQL 官方文档提供的经典样本数据库,用于演示表、视图、触发器、存储过程与函数等核心特性。本文以 Beekeeper Studio 开源仓库中 dev/docker_mysql_init/sakila/README.md 的说明为主线,讲解这份从 Sakila-spatial 派生的「multi-version(mv)」版本如何通过 MySQL 条件注释语法同时兼容 5.6/5.7+ 两代特性,并结合仓库内的 schema 文件、docker-compose 配置 与演示连接代码,说明如何在本地 Docker 环境与 Beekeeper Studio 中把它用起来。读完本文,你将掌握 Sakila 库的完整结构、/*!N ... */版本化 SQL 的写法与含义,以及一条从「初始化脚本」到「GUI 连接演示」的完整落地路径。
一、这份 README 说明了什么:Sakila-spatial 的派生与两项关键改动
仓库内的 README.md 全文非常简短,核心信息只有三点:
- 该样本数据库派生自 Sakila-spatial 数据库(后者来自 MySQL 官方文档示例库集合);
- 派生时做了非常简单的两处改动;
- 两处改动分别是:
- InnoDB 的 FULLTEXT 索引按条件添加,仅对 MySQL 5.6+ 生效;
- GEOMETRY 列与 SPATIAL 索引按条件添加,仅对 MySQL 5.7+ 生效。
这两条改动直接决定了sakila-mv-*中mv(multi-version)的含义:同一份 SQL 脚本,在不同版本的 MySQL 上执行时会得到不同的行为——低版本自动跳过不支持的特性,高版本自动获得完整能力。这种「一份脚本、多版本兼容」的做法,正是该样本库被选作 Beekeeper Studio 演示与回归测试数据源的重要原因。
从源码确认两处改动的具体落点
在 sakila-mv-schema.sql 中,两处改动都有明确的代码注释与版本号标记:
- 空间数据(对应改动 2,MySQL 5.7.5+):
CREATE TABLE address ( ... /*!50705 location GEOMETRY NOT NULL,*/ ... /*!50705 SPATIAL KEY `idx_location` (location),*/ ... )ENGINE=InnoDB DEFAULT CHARSET=utf8;- FULLTEXT / InnoDB(对应改动 1,MySQL 5.6.10+):
CREATE TABLE film_text ( film_id SMALLINT NOT NULL, title VARCHAR(255) NOT NULL, description TEXT, PRIMARY KEY (film_id), FULLTEXT KEY idx_title_description (title,description) )ENGINE=MyISAM DEFAULT CHARSET=utf8; -- After MySQL 5.6.10, InnoDB supports fulltext indexes /*!50610 ALTER TABLE film_text engine=InnoDB */;需要注意的是,film_text表本身在MyISAM引擎下就声明了FULLTEXT KEY(MyISAM 长期支持全文索引),而改动 1 的实质是在 MySQL 5.6.10 之后通过/*!50610 */条件注释把整张表ALTER 为 InnoDB 引擎,从而让 InnoDB 全文索引能力被启用。这与 README 中「InnoDB 的 FULLTEXT 索引按条件添加,MySQL 5.6+」的描述完全对应。
二、版本条件执行语法/*!N ... */的原理
上述两处改动都依赖 MySQL 特有的**可执行版本注释(versioned comments)**语法。其格式为:
/*!N SQL语句 */N是 5 位或 6 位版本号,例如50610表示 MySQL 5.6.10,50705表示 MySQL 5.7.5;- 当当前服务器版本 ≥ N时,注释内的 SQL 会被当作真实语句执行;
- 当当前服务器版本< N时,整段内容被当作普通注释忽略。
这解释了仓库选择该语法的动机:官方 Sakila-spatial 假定较新的 MySQL 版本,直接导入旧版本会因GEOMETRY类型或SPATIAL KEY不支持而报错;而套上版本注释后,脚本可以在「任何 MySQL 5.x 版本」上导入——这一点在 schema 文件头部也有明确记录(Modified in September 2015 by Giuseppe Maxia,注释为The schema and data can now be loaded by any MySQL 5.x version)。
Schema 文件开头的三条SET也保证了多版本下的安全执行:
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';先关闭唯一性检查与外键检查,再用TRADITIONAL严格模式建表,文件末尾再统一恢复现场(sakila-mv-schema.sql),保证导入过程对既有会话状态无副作用。
三、完整 schema 盘点:16 张表 + 6 个视图 + 触发器 + 存储过程与函数
除版本兼容改动外,schema 主体完整继承了 Sakila-spatial 的业务模型,非常适合作为 SQL 学习与 GUI 客户端功能验证的载体。从 sakila-mv-schema.sql 的 650 行脚本中可以梳理出以下组成:
3.1 表结构(InnoDB,utf8)
| 表 | 关键字段 / 特色 | 定义位置 |
|---|---|---|
actor | actor_id自增主键、last_name索引 | L30-L37 |
address | 含条件化的location GEOMETRY与 SPATIAL 索引 | L43-L57 |
category/city/country | 基础维度表,外键级联策略ON DELETE RESTRICT ON UPDATE CASCADE | L63-L93 |
customer | active BOOLEAN、email、create_date DATETIME | L99-L115 |
film | rating ENUM('G','PG','PG-13','R','NC-17')、special_features SET(...)、rental_rate DECIMAL(4,2) | L121-L141 |
film_actor/film_category | 多对多关联表,复合主键 | L147-L168 |
film_text | FULLTEXT 全文索引 + 引擎条件转换(改动 1 的核心) | L174-L183 |
inventory/language/staff/store | 库存、语言、员工(含picture BLOB)、门店 | L218-L321 |
payment/rental | 支付与租赁流水,rental有UNIQUE KEY (rental_date, inventory_id, customer_id) | L245-L282 |
值得关注的是film表对ENUM 与 SET 类型、staff.password对VARCHAR(40) BINARY的使用,以及address.location对空间类型的条件化引入——这些都是 MySQL 区别于其他数据库的典型类型特性,非常适合在 Beekeeper Studio 中观察类型映射与结果展示。
3.2 触发器:维护film_text与film的一致性
film_text不直接由业务写入,而是由三个触发器自动维护(L189-L212):
DELIMITER ;; CREATE TRIGGER `ins_film` AFTER INSERT ON `film` FOR EACH ROW BEGIN INSERT INTO film_text (film_id, title, description) VALUES (new.film_id, new.title, new.description); END;;ins_film:插入film后同步插入film_text;upd_film:当title/description/film_id任一变化时更新film_text;del_film:删除film后同步删除film_text。
该设计演示了「为全文检索冗余一份文本表」的经典模式,也是测试客户端触发器等对象浏览功能的现成素材。
3.3 视图:面向报表的封装
脚本内定义了 6 个视图(L327-L445):
customer_list:顾客信息 + 地址城市国家连接;film_list:影片信息 + 演员名单(GROUP_CONCAT拼接);nicer_but_slower_film_list:对演员姓名做首字母大写的「更慢但更好看」版本;staff_list:员工 + 门店视图;sales_by_store/sales_by_film_category:按门店、按影片分类汇总销售额的报表视图;actor_info:以SQL SECURITY INVOKER定义的演员影片分类汇总视图。
其中film_list用GROUP_CONCAT(... SEPARATOR ', ')把一部影片的演员列表聚合成单行文本,是理解 MySQL 聚合字符串的典型示例。
3.4 存储过程与函数:演示 IN/OUT 参数与业务逻辑
rewards_report(min_monthly_purchases, min_dollar_amount_purchased, OUT count_rewardees):月度忠诚客户报表,含参数合法性校验、临时表tmpCustomer的使用(L453-L516);get_customer_balance(p_customer_id, p_effective_date):计算截至某日期的客户余额(租金 + 逾期费 − 已支付),用三条SELECT ... INTO分别累计(L520-L559);film_in_stock(p_film_id, p_store_id, OUT p_film_count)/film_not_in_stock(...):分别调用inventory_in_stock判断某门店某影片的在库/缺货数量(L565-L593);inventory_held_by_customer(p_inventory_id):查询某库存当前被哪个客户持有(return_date IS NULL),无记录时通过EXIT HANDLER FOR NOT FOUND RETURN NULL返回空(L597-L609);inventory_in_stock(p_inventory_id):返回布尔值,判断库存是否在架(L615-L642)。
这些对象对于验证数据库客户端的过程/函数/触发器浏览、参数调用与结果集展示能力非常有价值。
四、数据文件:46,000+ 行的完整示例数据
与 schema 配套的是 sakila-mv-data.sql,共 46,434 行。数据文件的组织方式同样兼顾了多版本兼容:
- 开头同样关闭外键/唯一检查并
USE sakila;,结尾恢复; - 采用
SET AUTOCOMMIT=0;+ 多行批量INSERT的方式灌入数据(如 actor 表的 200 位演员数据),降低导入耗时并便于事务化回滚; - 数据内容覆盖演员、地址、影片、库存、租赁、支付等全链路业务,例如经典的 1,000 部影片、200 位演员、599 位顾客等,足以支撑 JOIN、聚合、子查询、空间/全文检索等各类演示 SQL。
五、在 Docker 与 Beekeeper Studio 中的落地使用
5.1 docker-compose 中的挂载方式
仓库根目录的 docker-compose.yml 定义了多个数据库服务,其中 MySQL 系服务均将./dev/docker_mysql_init目录挂载为官方镜像的初始化目录/docker-entrypoint-initdb.d:
mysql:mysql:5.7.22,端口映射3306:3306,MYSQL_ROOT_PASSWORD: example、MYSQL_DATABASE: test(L197-L208);mysql8:mysql:8.0.21,端口3308:3306,并显式指定--default-authentication-plugin=mysql_native_password(L185-L196);mariadb:mariadb最新镜像,端口3307:3306(L174-L184)。
由于sakila-mv-*脚本位于该挂载目录下,容器首次启动时会按字母序自动执行sakila-mv-schema.sql再执行sakila-mv-data.sql(MySQL 官方镜像按文件名排序执行.sql/.sh初始化脚本),因此无需任何手动干预即可获得一个带完整 Sakila 数据的数据库。启动方式:
docker compose up -d mysql8 # 或 mysql(5.7)、mariadb启动后连接参数为:主机localhost、端口3308(mysql8)/3306(mysql 5.7)/3307(mariadb)、用户名root、密码example、默认数据库test(脚本执行后库内另有sakila库)。
注意:5.7 与 8.0 两个服务的
command都附加了--default-authentication-plugin=mysql_native_password,这是为了让老版本客户端工具(含 Beekeeper Studio 的 MySQL 驱动)能以传统密码认证方式直连,属于仓库为兼容性做的显式配置。
5.2 Beekeeper Studio 中的演示连接
仓库的开发用迁移脚本 apps/studio/src/migration/dev-1.js 中注册了一组[DEV]前缀的演示连接,其中包括指向上述 Docker MySQL 服务与 SQLite 的条目:
[DEV] Docker MySQL:port: 3307、用户root、密码example、默认库employees;[DEV] local Sqlite:defaultDatabase: './dev/sakila.db',即本地 SQLite 形态的 Sakila 数据;[DEV] Docker PSQL/[DEV] Docker SQLServer等其它数据库的演示连接。
从中可以看到 Sakila 数据集在仓库中的定位:同一套业务模型被复用到多种数据库形态(MySQL 容器、SQLite 文件等),用于开发与端到端测试时验证不同驱动下的一致性表现。你在 Beekeeper Studio 中新建 MySQL 连接时,按 5.1 节的端口、账号、密码填入即可直接查询sakila库,并可以用下面这类语句立刻体验视图、聚合与存储过程:
-- 通过视图查看影片与演员 SELECT * FROM sakila.film_list WHERE rating = 'PG' LIMIT 10; -- 分组聚合示例 SELECT c.name AS category, SUM(p.amount) AS total_sales FROM sakila.payment p JOIN sakila.rental r ON p.rental_id = r.rental_id JOIN sakila.inventory i ON r.inventory_id = i.inventory_id JOIN sakila.film f ON i.film_id = f.film_id JOIN sakila.film_category fc ON f.film_id = fc.film_id JOIN sakila.category c ON fc.category_id = c.category_id GROUP BY c.name ORDER BY total_sales DESC; -- 调用存储过程(需传入两个 IN 参数) CALL sakila.rewards_report(10, 20.00, @cnt);六、总结
dev/docker_mysql_init/sakila/目录虽然 README 只有寥寥数行,但其承载的 Sakila-spatial 派生库具备完整的教学与测试价值:
- 兼容性设计:通过
/*!50610 */、/*!50705 */版本注释把 InnoDB 全文索引(5.6+)与空间列/空间索引(5.7+)做成条件特性,保证任意 MySQL 5.x 可导入,具体实现见 sakila-mv-schema.sql; - 内容完备:16 张表、6 个视图、3 个触发器、3 个存储过程、3 个函数,覆盖 MySQL 的 ENUM/SET、BLOB、空间类型、全文索引、外键级联与
GROUP_CONCAT等特性; - 开箱即用:配合 docker-compose.yml 中
mysql/mysql8/mariadb服务的自动初始化挂载,一条docker compose up即可在 Beekeeper Studio 中连入sakila库进行功能验证与学习。
无论你是想学习 MySQL 特性、验证 SQL 客户端能力,还是需要一个稳定的回归测试数据源,这份「multi-version」版本的 Sakila 都是仓库中可直接复用的现成方案。
【免费下载链接】beekeeper-studioModern and easy to use SQL client for MySQL, Postgres, SQLite, SQL Server, and more. Linux, MacOS, and Windows.项目地址: https://gitcode.com/GitHub_Trending/be/beekeeper-studio
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考