sql >> Databasteknik >  >> RDS >> MariaDB

Automatisk dataversionering i MariaDB Server 10.3

MariaDB Server 10.3 kommer med en ny, mycket användbar funktion som kommer att underlätta designen av många applikationer. Dataversionering är viktigt för flera perspektiv. Efterlevnad kan kräva att du behöver lagra dataändringar. För analytiska frågor kanske du vill titta på data vid en specifik tidpunkt och för revisionsändamål, vilka ändringar som gjordes och när är viktigt. Om en tabell raderas kan det också vara av stort värde att återställa den från historiken. MariaDB Server innehåller nu en funktion som heter System-Versioned Tables, som är baserad på specifikationen i SQL:2011-standarden. Det ger automatisk versionshantering av tabelldata.

Jag ska gå igenom konceptet med systemversionerade tabeller med ett mycket enkelt exempel, som visar dig vad det handlar om. Låt oss börja med att skapa en databas och en tabell.

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 precis ut som tidigare förutom det sista tabellalternativet MED SYSTEM_VERSIONING, som slår på den automatiska versionshanteringen på tabellen. Låt oss se hur det fungerar genom att infoga en rad 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)

Där har vi mig som en rad i en tabell. Den intressanta delen börjar när vi uppdaterar rader. Jag kommer att byta avdelning ett par gånger.

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 säger MariaDB Server att det finns 1 ändrad rad för varje uppdatering som vanligt, men också 1 insatt, vilket inte skulle vara fallet för en tabell utan versionshantering. Varje uppdatering orsakar en ny version av raden, som måste infogas i tabellen. Som du också ser ovan kommer en normal SELECT endast att visa den senaste versionen. För att se alla versioner av raderna tillhandahåller MariaDB Server följande syntax.

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)

För att kunna se när raderna har uppdaterats vill vi inkludera två osynliga kolumner som skapas av den automatiska versioneringen. Invisible Column är en annan spännande ny funktion i MariaDB Server 10.3. De osynliga kolumnerna för automatisk versionshantering är ROW_START och ROW_END. De definierar den tidsperiod för vilken versionen av raden var/är giltig.

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 intressanta nu är att göra punkt-i-tidsfrågor för att hämta exakt hur tabellen såg ut vid ett specifikt datum och tid. Vi kan göra detta genom att använda syntaxen 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)

Detta var bara en liten glimt av systemversionerade tabeller. Utöver exemplen som visas ovan kan du placera historik på separata partitioner av prestandaskäl, utesluta kolumner från versionshantering och mycket mer.

Läs mer om systemversionerade tabeller i MariaDB-dokumentationen. Skaffa MariaDB Server 10.3 som en del av nedladdningen av MariaDB TX 3.0 – nu tillgänglig.


  1. Hur man återställer MySQL root-lösenordet

  2. Hur TRUNCATE() fungerar i MariaDB

  3. Hur deklarerar man variabel och använder den i samma Oracle SQL-skript?

  4. Hur REGEXP_INSTR()-funktionen fungerar i MySQL