Hash MariaDB虚拟列-可以给我一个哈希吗?

Hash MariaDB虚拟列-可以给我一个哈希吗?,hash,mariadb,calculated-columns,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 (

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;

该表达式对于MariaDB虚拟列是完全合法的。因为它是一个持久性列,所以您甚至可以为它编制索引


顺便说一下,在您的示例中,VARCHAR之后有一个语法错误。

该表达式对于MariaDB虚拟列是完全合法的。因为它是一个持久性列,所以您甚至可以为它编制索引


顺便说一句,在您的示例中,VARCHAR之后有一个语法错误。

使用括号的语法,如中所述

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;

使用大括号的语法,如中所述

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;