我有一个现有的 MariaDB 表,我想保留使用内置系统版本控制功能的更改历史记录。我使用的是 MariaDB 10.5,但我还在 10.11(该系统将在接下来的 6-12 个月内迁移到该版本)上测试了这个问题中的所有内容。
我也想单独存储历史,原因如下:
- 每行平均编辑 10 次,因此历史数据集最终将是当前数据集大小的 10 倍。
- 所有交互式查询(约占所有查询的 95%)都将针对当前数据集运行,因此我希望它尽可能小。
- 需要访问历史数据集的查询在响应时间不是问题的通宵批处理作业中运行(例如,用 1 秒返回而不是 0.1 秒是可以接受的)。
但是,如果我尝试使用以下查询在现有表上执行此操作:
ALTER TABLE t ADD SYSTEM VERSIONING PARTITION BY SYSTEM_TIME;
这失败了:
SQL Error [1217] [23000]: (conn=5) Cannot delete or update a parent row: a foreign key constraint fails
即使我在运行查询之前关闭外键检查 (SET FOREIGN_KEY_CHECKS=0),也会发生这种情况。
我找到的解释是在MariaDB 文档的外键页面上:
分区表不能包含外键,也不能被外键引用。
这是否意味着如果表包含外键或被外键引用,则不可能通过单独保存历史记录进行系统版本控制?这似乎是我调查的结果,但考虑到大多数关系数据库都包含外键,而且 MariaDB 文档有一整节关于将历史记录保存在单独的分区中,这似乎也很奇怪——大概是因为这是一个常见的用例。
在 MariaDB 中有什么办法解决这个问题,还是我必须保留当前数据的历史记录(这将使数据集增加 10 倍)?另一种选择是创建一个单独的 t_history 表并让应用程序跟踪历史记录,但这不会捕获在应用程序外部所做的更改,例如,如果开发人员手动运行 UPDATE 查询。
根据以下错误,答案是目前我想要的行为不可用:
https://jira.mariadb.org/browse/MDEV-19191
还有两个其他错误阻止了 19191 的解决,其中一个是停滞的,因此可能需要一段时间才能使用此功能。