mariadb - 在 MariaDB 的时态表中恢复到特定时间的先前版本
问题描述
我有一个 MariaDB 时态表,如下所示。
架构:
MariaDB [teamdb]> DESCRIBE t2;
+-------+---------+------+-----+---------+---------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+---------------------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| x | int(11) | YES | | NULL | |
| y | int(11) | YES | | NULL | WITHOUT SYSTEM VERSIONING |
+-------+---------+------+-----+---------+---------------------------+
数据(当前):
MariaDB [teamdb]> SELECT * FROM t2;
+----+------+------+
| id | x | y |
+----+------+------+
| 1 | 1 | 1 |
| 2 | 2 | 2 |
| 3 | 3 | 4 |
| 4 | 5 | 4 |
+----+------+------+
数据(带历史):
MariaDB [teamdb]> select *, ROW_START, ROW_END from t2 FOR SYSTEM_TIME ALL;
+----+------+------+----------------------------+----------------------------+
| id | x | y | ROW_START | ROW_END |
+----+------+------+----------------------------+----------------------------+
| 1 | 1 | 1 | 2019-08-15 06:41:18.684508 | 2038-01-19 03:14:07.999999 |
| 2 | 1 | 2 | 2019-08-15 06:41:18.684508 | 2019-08-15 06:42:11.661167 |
| 2 | 2 | 2 | 2019-08-15 06:42:11.661167 | 2038-01-19 03:14:07.999999 |
| 3 | 3 | 4 | 2019-08-15 06:41:18.684508 | 2038-01-19 03:14:07.999999 |
| 4 | 5 | 4 | 2019-08-15 06:41:18.684508 | 2038-01-19 03:14:07.999999 |
+----+------+------+----------------------------+----------------------------+
问题:
我想将记录 ( id=2
) 恢复到2019-08-15 06:42:10.661167
时间戳中的版本。这意味着,在更新之后,记录#2 应该x = 1
再次具有。
我尝试插入ON DUPLICATE
如下查询所示,
INSERT INTO t2 (id,x,y)
SELECT t.id,t.x,t.y
FROM t2 t
FOR SYSTEM_TIME AS OF TIMESTAMP '2019-08-15 06:42:10.661167'
WHERE t.id=2
ON DUPLICATE KEY UPDATE x=t.x, y=t.y;
这给了我一个错误,说存在语法错误。
ERROR 1064 (42000): You have an error in your SQL syntax;
check the manual that corresponds to your MariaDB server version
for the right syntax to use near 'SYSTEM_TIME AS OF TIMESTAMP '2019-08-15 06:42:10.661167' WHERE t.id=2 ON DUPLICA' at line 1
根据错误,似乎 MariaDB 没有FOR
在选择插入中识别子句。
使用查询恢复到其他版本的任何其他方式。
解决方案
这不是关于识别FOR
子句,而是关于表别名的位置。
INSERT INTO t2 (id,x,y)
SELECT t.id,t.x,t.y
FROM t2
FOR SYSTEM_TIME AS OF TIMESTAMP '2019-08-15 06:42:10.661167' t
WHERE t.id=2
ON DUPLICATE KEY UPDATE x=t.x, y=t.y;
注意t
系统时间子句的重定位。
推荐阅读
- python-3.x - 如何使用 Anaconda 在 WSL + UBUNTU20.04 + python3.8 上安装 openCV?
- html - 调整屏幕大小时隐藏元素
- python - Jupyter Notebook 不会自动完成库、方法或属性的代码
- shopify - 如何将运费添加到特定产品 shopify?
- python - 在python中转换为纯文本
- pdfbox - 关于 Apache PDFBox 和 PDF 认证的问题
- javascript - 为什么 splice 函数中的变量 i 递减?
- python - 带有 CherryPy 的 Django - ModuleNotFound 错误
- angular - 使用 @ngtools/webpack 在 Angular 11 + Webpack 4 中实现 AOT
- angular - 隐藏在 kendo kendo-sortable angular 中拖动时的弹出窗口