【问题标题】:How to create a column B that dynamically calculates SHA1 of column A when column A got inserted?如何在插入 A 列时创建动态计算 A 列 SHA1 的 B 列?
【发布时间】:2014-08-07 10:31:01
【问题描述】:

本题继续上一题 How to create Trigger to prevent inserting the duplicate row in MYSQL 5.0.27?

现在我有一个 MyText 表,其中有 ID(自动增量)列、文本(varchar 700、utf8)列

标识 - 文本 1 - 这是我的文字 2 - xxxx

现在我想添加一个新列“textHash”,即SHA1(lower(text))。这意味着每次在text 列中插入新文本时,“textHash”列都会计算哈希值并相应更新。

例如,开头

Id - 文本 - textHash 1 - 这是我的文字 - 5sd4as55ads 2 - xxxx - zxcz5454

那么如果有人insert into myTable (text) values ('new text'),那么表格会是这样的:

Id - 文本 - textHash 1 - 这是我的文字 - 5sd4as55ads 2 - xxxx - zxcz5454 3 - 新文本 - 212121zxc

那么该如何处理呢?

【问题讨论】:

  • 触发器是你想要的。或者,您可以考虑使用计算列

标签: mysql sql


【解决方案1】:

使用以下触发器:

delimiter //
create trigger texthash
before insert on mytext
for each row
begin
   set new.txt_hash = sha1(lower(new.text));
end;
//
delimiter ;

小提琴示例在这里:http://sqlfiddle.com/#!2/67b15/1/0

您必须将分隔符设置为分号以外的内容(在我的示例中为 // )以区分触发器的开始和结束,因为语句中有分号。 (您可以在创建触发器后立即将其设置回分号)

请注意,无论文本字段的长度如何,SHA1 值始终为 40 个字符。 IE。 “新文本”的 SHA1 哈希为 1eb8a29393c0e376645481c0185ec8ef05c0b65c

关于您的评论,尝试将您发布的内容完全格式化如下(逐行):我注意到的唯一一件事是您忘记了 SET 后的分号

DELIMITER $$
CREATE TRIGGER textHash_InsertTrigger
BEFORE INSERT ON myTable
FOR EACH ROW
begin
   set new.textHash=sha1(lower(new.text));
end;
$$
DELIMITER ; 

【讨论】:

  • 你忘记了 sha1(lower(new.text))?因为我不在乎大小写
  • 它说“您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以在 'set new.textHash=sha1(lower(new. text)) 在第 1 行结束"
  • DELIMITER $$ CREATE TRIGGER textHash_InsertTrigger BEFORE INSERT ON myTable FOR EACH ROW begin set new.textHash=sha1(lower(new.text)) end; $$ 分隔符;
  • @Tum 可能只是您的 SET 后面的分号(它不存在),但请尝试使用我刚刚在上面回答中的内容来澄清其他任何内容
【解决方案2】:
create trigger hashing before insert on table
for each row begin
   set table.textHash= md5(text);
end;

不太清楚语法,但逻辑应该是正确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    相关资源
    最近更新 更多