sql >> Database teknologi >  >> RDS >> MariaDB

Automatisk dataversionering i MariaDB Server 10.3

MariaDB Server 10.3 kommer med en ny, meget nyttig funktion, der vil lette designet af mange applikationer. Dataversionering er vigtig for flere perspektiver. Overholdelse kan kræve, at du skal gemme dataændringer. For analytiske forespørgsler vil du måske se på data på et bestemt tidspunkt og til revisionsformål, hvilke ændringer der blev foretaget, og hvornår er vigtigt. I tilfælde af at en tabel bliver slettet, kan det også være af stor værdi at gendanne den fra historikken. MariaDB Server inkluderer nu en funktion ved navn System-Versioned Tables, som er baseret på specifikationen i SQL:2011-standarden. Det giver automatisk versionering af tabeldata.

Jeg vil gennemgå konceptet med systemversionerede tabeller med et meget simpelt eksempel, som vil vise dig, hvad det handler om. Lad os starte med at oprette en database og en tabel.

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;

Det ser nøjagtigt ud som før, bortset fra den sidste tabelmulighed MED SYSTEM_VERSIONING, som aktiverer den automatiske versionering på tabellen. Lad os se, hvordan det virker, ved at indsætte en række i tabellen.

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)

Der har vi mig som én række i en tabel. Den interessante del starter, når vi opdaterer rækker. Jeg skifter afdeling et par gange.

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)

Som du kan se fortæller MariaDB Server, at der er 1 ændret række for hver opdatering som normalt, men også 1 indsat, hvilket ikke ville være tilfældet for en tabel uden versionering. Hver opdatering forårsager en ny version af rækken, som skal indsættes i tabellen. Som du også kan se ovenfor, vil en normal SELECT kun vise den seneste version. For at se alle versioner af rækkerne giver MariaDB Server følgende syntaks.

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)

For at kunne se, hvornår rækkerne er blevet opdateret, ønsker vi at inkludere to usynlige kolonner, der er oprettet ved den automatiske versionering. Invisible Column er en anden spændende ny funktion i MariaDB Server 10.3. De usynlige kolonner for automatisk versionering er ROW_START og ROW_END. De definerer den tidsperiode, for hvilken versionen af ​​rækken var/er gyldig.

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)

Det interessante nu er at lave punkt-i-tidsforespørgsler for at finde præcis, hvordan tabellen så ud på en bestemt dato og et bestemt tidspunkt. Vi kan gøre dette ved at bruge AS OF-syntaksen:

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)

Dette var blot et lille indblik i systemversionerede tabeller. Ud over eksemplerne vist ovenfor kan du placere historik på separate partitioner af ydeevnemæssige årsager, udelukke kolonner fra versionering og meget mere.

Læs mere om systemversionerede tabeller i MariaDB-dokumentationen. Få MariaDB Server 10.3 som en del af MariaDB TX 3.0 download – nu tilgængelig.


  1. Mærkelig dubletadfærd fra GROUP_CONCAT af to LEFT JOINs af GROUP_BYs

  2. Grundlæggende Oracle Trigger revisionstabel

  3. Hvordan skriver man en case-ufølsom forespørgsel til både MySQL og Postgres?

  4. RETNING:MySQL – VÆLG kommando nægtet bruger