如何告诉MySQL在更新/插入之前触发哈希?

时间:2011-08-20 09:22:30

标签: python mysql hash triggers insert

我很想在MySQL中创建一个触发器,这样每次我在一个名为title的列中插入一个值时,都会创建一个HASH并存储在title_hash列中。由于我不知道这是如何工作的,我在google搜索时找到了这段代码:

CREATE TRIGGER insertModelHash
BEFORE
  INSERT
ON
  products
FOR EACH ROW SET
  NEW.model_hash = CONV(RIGHT(MD5(NEW.products_model), 16), 16, 10)

MySQL-reference告诉我,这意味着:

  1. 创建名为insertModelHash ...
  2. 的触发器
  3. ...在插入行int products ...
  4. 之前
  5. 在我打算插入的每个新行中使用MD5, RIGHT, CONV列上的函数products_model
  6. 第3点需要更多解释:

    • 我想,NEW是新行的某种标识符。因此NEW.products_model指向当前(新)行中的列products_model
    • 然后发出MD5。由于我想使用SHA-2,因此我可以更改MD5(NEW.products_model), 16) ===> SHA2(NEW.products_model), 224)
    • 现在我很挣扎:为什么这个人会使用CONV(RIGHT(...)...)?这真的有必要吗?

    其他信息:现在,我正在做

    hashlib.sha224(title).hexdigest()
    
    在Python中

    并存储此值。

    我感谢任何建议/解释!

1 个答案:

答案 0 :(得分:5)

回答你的三个问题:

NEW关键字引用要插入的记录的'伪表'。在更新的触发器上,您可以访问“新”和“旧”,在删除时,只需“旧”。

是的,MD5用于创建哈希。但是,在您的问题中,您包含了'RIGHT'功能的部分参数。它只有MD5(NEW.products_model)(没有, 16)。是的,您可以将SHA2替换为MD5(如果它可用)(仅当MySQL配置为支持SSL时才可用)。

RIGHT(string, number)只是从'string'中取出正确的'number'字符。 CONV()函数用于转换基数之间的数字。这两个函数的组合采用散列的正确16个字符,并将它们从基数16(十六进制)转换为基数10(十进制)。

答案是否定的,如果您只想存储哈希本身,则不需要它们。

  NEW.model_hash = SHA2(NEW.products_model)