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;
答案 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;