【问题标题】:MariaDB Virtual Columns - Can I have a hash?MariaDB 虚拟列 - 我可以有哈希吗?
【发布时间】:2014-11-29 16:40:28
【问题描述】:

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;

【问题讨论】:

    标签: hash mariadb calculated-columns


    【解决方案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;
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-23
        • 2013-03-24
        • 1970-01-01
        • 2010-12-22
        • 1970-01-01
        • 1970-01-01
        • 2016-02-05
        相关资源
        最近更新 更多