Hash MariaDB虚拟列-可以给我一个哈希吗?
MariaDB具有虚拟列,允许对其他列数据自动执行操作。例如,如果您想要以不同的度量单位显示数据,只需除以10或1000即可,如下表定义所示: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 (
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;