sql >> Databáze >  >> RDS >> MariaDB

Automatické verzování dat na serveru MariaDB 10.3

MariaDB Server 10.3 přichází s novou, velmi užitečnou funkcí, která usnadní návrh mnoha aplikací. Verze dat je důležitá z několika úhlů pohledu. Soulad může vyžadovat uložení změn dat. U analytických dotazů se možná budete chtít podívat na data v určitém časovém okamžiku a pro účely auditu je důležité, jaké změny byly provedeny a kdy. V případě smazání tabulky může být také velmi užitečné obnovit ji z historie. MariaDB Server nyní obsahuje funkci s názvem System-Versioned Tables, která je založena na specifikaci ve standardu SQL:2011. Poskytuje automatické verzování dat tabulky.

Projdu konceptem System-Versioned Tables na velmi jednoduchém příkladu, který vám ukáže, o co jde. Začněme vytvořením databáze a tabulky.

CREATE DATABASE Company; 

CREATE TABLE Person (
  Id int(11) NOT NULL AUTO_INCREMENT,
  FirstName varchar(50) NOT NULL,
  LastName varchar(50) NOT NULL,
  Gender char(1) NOT NULL,
  DepartmentId int(11) NOT NULL,
  PRIMARY KEY (Id),
  CONSTRAINT con_gender CHECK (Gender in ('f','m')))
WITH SYSTEM VERSIONING;

Vypadá úplně stejně jako předtím kromě poslední možnosti tabulky WITH SYSTEM_VERSIONING, která zapíná automatické verzování na stole. Podívejme se, jak to funguje, vložením řádku do tabulky.

MariaDB [Company]> INSERT INTO Person (FirstName, LastName, Gender, DepartmentId) VALUES ('Rasmus', 'Johansson', 'm', 1);
Query OK, 1 row affected (0.002 sec)

MariaDB [Company]> SELECT * FROM Person;
+----+-----------+-----------+--------+--------------+
| Id | FirstName | LastName  | Gender | DepartmentId |
+----+-----------+-----------+--------+--------------+
|  1 | Rasmus    | Johansson | m      |            1 |
+----+-----------+-----------+--------+--------------+
1 row in set (0.001 sec)

Tady mě máme jako jeden řádek v tabulce. Zajímavá část začíná, když aktualizujeme řádky. Několikrát změním oddělení.

MariaDB [Company]> UPDATE Person SET DepartmentId = 2 WHERE Id = 1;                                      Query OK, 1 row affected (0.002 sec)
Rows matched: 1  Changed: 1  Inserted: 1  Warnings: 0

MariaDB [Company]> SELECT * FROM Person;
+----+-----------+-----------+--------+--------------+
| Id | FirstName | LastName  | Gender | DepartmentId |
+----+-----------+-----------+--------+--------------+
|  1 | Rasmus    | Johansson | m      |            2 |
+----+-----------+-----------+--------+--------------+
1 row in set (0.001 sec)

MariaDB [Company]> UPDATE Person SET DepartmentId = 3 WHERE Id = 1;
Query OK, 1 row affected (0.003 sec)
Rows matched: 1  Changed: 1  Inserted: 1  Warnings: 0

MariaDB [Company]> SELECT * FROM Person;
+----+-----------+-----------+--------+--------------+
| Id | FirstName | LastName  | Gender | DepartmentId |
+----+-----------+-----------+--------+--------------+
|  1 | Rasmus    | Johansson | m      |            3 |
+----+-----------+-----------+--------+--------------+
1 row in set (0.001 sec)

Jak můžete vidět, MariaDB Server říká, že pro každou aktualizaci je jako obvykle 1 změněný řádek, ale také 1 vložen, což by nebyl případ tabulky bez verzování. Každá aktualizace způsobí novou verzi řádku, kterou je třeba vložit do tabulky. Jak také vidíte výše, normální SELECT zobrazí pouze nejnovější verzi. Chcete-li zobrazit všechny verze řádků, server MariaDB poskytuje následující syntaxi.

MariaDB [Company]> SELECT * FROM Person FOR SYSTEM_TIME ALL;
+----+-----------+-----------+--------+--------------+
| Id | FirstName | LastName  | Gender | DepartmentId |
+----+-----------+-----------+--------+--------------+
|  1 | Rasmus    | Johansson | m      |            1 |
|  1 | Rasmus    | Johansson | m      |            2 |
|  1 | Rasmus    | Johansson | m      |            3 |
+----+-----------+-----------+--------+--------------+
3 rows in set (0.001 sec)

Abychom mohli vidět, kdy byly řádky aktualizovány, chceme zahrnout dva neviditelné sloupce, které jsou vytvořeny automatickým verzováním. Invisible Columnsis je další vzrušující novou funkcí MariaDB Server 10.3. Neviditelné sloupce automatického verzování jsou ROW_START a ROW_END. Definují časové období, po které verze řádku byla/je platná.

MariaDB [Company]> SELECT *, ROW_START, ROW_END FROM Person FOR SYSTEM_TIME ALL;
+----+-----------+-----------+--------+--------------+----------------------------+----------------------------+
| Id | FirstName | LastName  | Gender | DepartmentId | ROW_START                  | ROW_END                    |
+----+-----------+-----------+--------+--------------+----------------------------+----------------------------+
|  1 | Rasmus    | Johansson | m      |            1 | 2018-05-03 07:21:12.386980 | 2018-05-03 07:22:29.188266 |
|  1 | Rasmus    | Johansson | m      |            2 | 2018-05-03 07:22:29.188266 | 2018-05-03 07:22:47.596481 |
|  1 | Rasmus    | Johansson | m      |            3 | 2018-05-03 07:22:47.596481 | 2038-01-19 03:14:07.999999 |
+----+-----------+-----------+--------+--------------+----------------------------+----------------------------+
3 rows in set (0.000 sec)

Zajímavé je nyní provádět dotazy k určitému bodu v čase, abyste získali přesně to, jak tabulka vypadala v určité datum a čas. Můžeme to udělat pomocí syntaxe AS OF:

MariaDB [Company]> SELECT * FROM Person FOR SYSTEM_TIME AS OF TIMESTAMP '2018-05-03 07:22:33';
+----+-----------+-----------+--------+--------------+
| Id | FirstName | LastName  | Gender | DepartmentId |
+----+-----------+-----------+--------+--------------+
|  1 | Rasmus    | Johansson | m      |            2 |
+----+-----------+-----------+--------+--------------+
1 row in set (0.001 sec)

Toto bylo jen malé nahlédnutí do tabulek verze systému. Kromě výše uvedených příkladů můžete z důvodu výkonu umístit historii na samostatné oddíly, vyloučit sloupce z verzování a mnoho dalšího.

Přečtěte si více o tabulkách s verzí systému v dokumentaci MariaDB. Získejte MariaDB Server 10.3 jako součást stahování MariaDB TX 3.0 – nyní k dispozici.


  1. Oracle 11g Express Edition pro Windows 64bit?

  2. Jak zkontrolovat verzi MySQL

  3. Uložit běžný dotaz jako sloupec?

  4. Rozdíl mezi literály N'String' a U'String' v Oracle