MariaDB虚拟列 - 我可以使用哈希吗?

时间:2014-11-29 16:40:29

标签: hash mariadb calculated-columns

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;

2 个答案:

答案 0 :(得分:1)

该表达式对于MariaDB虚拟列完全合法。由于它是一个持久列,您甚至可以将其编入索引。

顺便说一句,在VARCHAR之后,示例中存在语法错误。

答案 1 :(得分:1)

使用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;