本节描述了 Sakila 示例数据库每个版本中的更改。
修复了 MySQL 错误 #112131:将 film_text.film_id 字段设为无符号,以匹配其他 film_id 定义。
film_list 和 nicer_but_slower_film_list 视图不返回没有演员的电影。
修复了 MySQL 错误 #106951:
city和country字段中缺少带重音符号的字符;它们的值已使用world数据库更新。此外,也缺少尖音符号本身。修复了 MySQL 错误 #107158:删除了 payment 表中 rental_id 值为空的五行。
数据库对象现在使用
utf8mb4而不是utf8。此更改导致 MySQL 5.6 中film.title列出现指定的键过长;最大键长度为 767 个字节错误,该列声明为VARCHAR(255)。实际的最大标题长度为 27 个字符,因此该列被重新声明为VARCHAR(128),以避免超过最大键长度。sakila-schema.sql和sakila-data.sql包含SET NAMES utf8mb4语句。sakila-data.sql已从 DOS (CRLF) 行结尾转换为 Unix (LF) 行结尾。address.location列是一个GEOMETRY列,它有一个SPATIAL索引。从 MySQL 8.0.3 开始,除非索引空间列具有SRID属性,否则将忽略SPATIAL索引。location列已更改为包含SRID 0属性,适用于 MySQL 8.0.3 及更高版本。staff.password列声明为VARCHAR(40) BINARY。这是在字符列声明中使用BINARY作为指定_bin排序规则的简写,从 MySQL 8.0.17 开始已弃用。该列被重新声明为BINARY的简写形式,即VARCHAR(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin。在
rewards_report()存储过程中,min_dollar_amount_purchased参数声明为DECIMAL(10,2) UNSIGNED。从 MySQL 8.0.17 开始,不建议将UNSIGNED与DECIMAL一起使用。该参数在重新声明时未包含UNSIGNED。film_in_stock()和film_not_in_stock()存储过程使用了FOUND_ROWS()函数,该函数从 MySQL 8.0.17 开始已弃用。在每个过程中,FOUND_ROWS()查询都被替换为使用COUNT(*)的查询,该查询与其关联查询使用相同的FROM和WHERE子句。这比使用FOUND_ROWS()更昂贵,但产生相同的结果。在 MySQL 5.6.10 之前的版本中,
film_text表使用MyISAM而不是InnoDB,以避免在旧版本中创建表失败。(但是,我们仍然建议升级到 MySQL 5.6.10 或更高版本。)MySQL Workbench 的
sakila.mwb文件已根据上述更改进行了更新。
删除了所有
MyISAM引用。film_text表及其FULLTEXT定义现在使用InnoDB。如果您使用的是较旧的 MySQL 服务器版本(5.6.10 及更低版本),我们建议升级 MySQL。如果无法升级,请在sakila-schema.sqlSQL 文件中将film_text表的ENGINE值更改为MyISAM。
-
通过使用 MySQL 特定于版本的注释,将
sakila-schema.sql和sakila-spatial-schema.sql合并到一个文件中。从 MySQL 服务器 5.7.5(向
InnoDB添加了空间索引支持时)开始,空间数据(例如address.location)将插入到 sakila 数据库中。此外,从 MySQL 服务器 5.6.10 开始使用InnoDB全文搜索,在此之前使用的是MyISAM。
添加了 Sakila 示例数据库的另一个副本,其中包含使用几何数据类型的空间数据。这可以作为单独的下载获得,并且需要 MySQL 服务器 5.7.5 或更高版本。要使用此数据库,请加载
sakila-spatial-schema.sql文件而不是sakila-schema.sql文件。修改了
nicer_but_slower_film_list和film_list视图定义的GROUP BY子句,以使其与ONLY_FULL_GROUP_BYSQL 模式兼容,该模式从 MySQL 5.7.5 开始默认启用。
更正了
upd_film触发器定义,以包含对film_id值的更改。添加了
actor_info视图。更改了
inventory_held_by_customer函数的错误处理程序。函数现在有一个针对NOT FOUND的退出处理程序,而不是更隐晦的1329。将新 BSD 许可证的模板添加到架构和数据文件中。
在适用的情况下,将
READS SQL DATA添加到存储过程和函数中,以支持在 MySQL 5.1 上加载。修复了
rewards_report过程中日期范围问题(感谢 Goplat)。
修复了
sales_by_store视图中的一个错误,该错误导致每个商店都列出了相同的经理。修复了
inventory_held_by_customer函数中的一个错误,该错误导致函数返回多行。将
rental_date触发器移动到sakila-data.sql文件中,以防止它干扰数据加载。
添加了
film_in_stock存储过程。添加了
film_not_in_stock存储过程。添加了
inventory_help_by_customer存储函数。添加了
inventory__in_stock存储函数。优化了用于加载的数据文件(多行
INSERT语句、事务)。(感谢 Giuseppe)修复了
payment表加载脚本中的一个错误,该错误导致付款金额无限增加。
添加了
sales_by_store和sales_by_film_category视图,由 Jay Pipes 提交。添加了
rewards_report存储过程,由 Jay Pipes 提交。添加了
get_customer_balance存储过程。添加了
sakila-data.sql文件,用于将数据加载到示例数据库中。
将
address.district更改为VARCHAR(20)。将
customer.first_name更改为VARCHAR(45)。将
customer.last_name更改为VARCHAR(45)。将
customer.email更改为VARCHAR(50)。添加了
payment.rental_id列(一个INT NULL列)。为
payment.rental_id到rental.rental_id添加了外键。添加了
rental.rental_id,INT Auto_Increment,使其成为代理主键,旧主键更改为UNIQUE键。
所有表都有一个具有传统行为(
DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP)的last_updateTIMESTAMP列。actor_id现在是SMALLINT。address_id现在是SMALLINT。category_id现在是TINYINT。city_id现在是SMALLINT。country_id现在是SMALLINT。customer_id现在是SMALLINT。customer表中的first_name、last_name现在是CHAR而不是VARCHAR。customer表现在有email CHAR(50)。customer表上的create_date现在是DATETIME(以适应last_update TIMESTAMP)。customer表有一个新的ON INSERT触发器,用于强制将create_date列设置为NOW()。film_id现在是SMALLINT。film.description现在有DEFAULT NULL。添加了类型为
YEAR的film.release_year。添加了
film.language_id和film.original_language_id以及language表。对于可能已添加字幕的外国电影,original_language_id可以是NULL,language_id是NOT NULL。film.length现在是SMALLINT。删除了
film.category_id列。新表:
film_category;允许每部电影有多个类别。删除了
film_text.category_id列。inventory_id现在是MEDIUMINT。payment_id现在是SMALLINT。payment.payment_date现在是DATETIME。向
payment表添加了触发器,以强制在INSERT时将payment_date设置为NOW()。rental.rent_date现在是rental.rental_date,并且现在是DATETIME。在
rental表中添加了触发器,以确保在INSERT操作时将rental_date设置为NOW()。staff_id现在是TINYINT类型。添加了
staff.email列(VARCHAR(50))。添加了
staff.username列(VARCHAR(16))。store_id现在是TINYINT类型。更新了
film_list视图以处理新的film_category表。更新了
nicer_but_slower_film_list视图以处理新的film_category表。