Виртуальные столбцы MariaDB — могу ли я получить хэш?

В MariaDB есть виртуальные столбцы, которые позволяют автоматически выполнять действия с данными других столбцов. Например, это хорошо, если вы хотите отобразить данные в разных единицах метрического измерения, просто разделив их на 10 или 1000, как показано в определении таблицы ниже:

CREATE TABLE a (
     id INT NOT NULL AUTO_INCREMENT,
     distance_meters INT (11),
     distance_kilometers FLOAT (11,3) AS (distance_meters / 1000) VIRTUAL,
     PRIMARY KEY ( id )
) ENGINE=InnoDB;

Однако как создать виртуальный столбец, который является хэшем подмножества столбцов таблицы? Например. Таблица ниже (которая не работает) предназначена для хеширования имени и зарплаты, чтобы я мог легко проверить позже, изменились ли имена или зарплаты каких-либо сотрудников, сравнив их с предыдущим хэш-списком. Мне не нужен хеш всей строки.

CREATE TABLE employees (
    id INT NOT NULL,
    name VARCHAR(200),
    salary INT(12),
    age int(3),
    hash VARCHAR(AS (MD5(concat(name, salary)))) PERSISTENT,
    PRIMARY KEY ( id )
) ENGINE=InnoDB;

person Programster    schedule 29.11.2014    source источник


Ответы (2)


Это выражение вполне допустимо для виртуальных столбцов MariaDB. Поскольку это постоянный столбец, вы можете даже проиндексировать его.

Кстати, в вашем примере есть синтаксическая ошибка после VARCHAR.

person Federico Razzoli    schedule 29.11.2014

Используйте синтаксис с фигурными скобками, как описано в https://mariadb.com/kb/en/mariadb/documentation/sql-commands/data-definition/create/virtual-columns/

Замените VARCHAR на CHAR(32), так как хэш md5 имеет длину 32 символа.

Используйте concat_ws вместо concat для правильной обработки случаев, когда имя и/или зарплата равны NULL, и разделяйте имя и зарплату пробелом.

CREATE TABLE employees (
    id INT NOT NULL,
    name VARCHAR(200),
    salary INT(12),
    age int(3),
    hash CHAR(32) AS (MD5(concat_ws(' ', name, salary))) PERSISTENT,
    PRIMARY KEY ( id )
) ENGINE=InnoDB;
person Julian Ladisch    schedule 01.12.2014