我有一个MYSQL表,其中有5列:
id bigint
name varchar
description varchar
slug我能让MySQL自动生成name+description的256位散列形式的slug的值吗?
在保存之前,我现在使用PHP生成slug的SHA256值。
编辑:
所谓自动,我的意思是看看是否可以将slug字段的默认值更改为计算字段,即name+description的sha256。
我已经知道如何在insert操作中创建它。
发布于 2016-08-03 08:20:50
MySQL 5.7支持generated columns,因此您可以定义一个表达式,并且它将为您插入或更新的每一行自动更新。
CREATE TABLE IF NOT EXISTS MyTable (
id int NOT NULL AUTO_INCREMENT,
name varchar(50) NOT NULL,
description varchar(50) NOT NULL,
slug varchar(64) AS (SHA2(CONCAT(name, description), 256)) STORED NOT NULL,
PRIMARY KEY (id)
) DEFAULT CHARSET=utf8;如果您使用的是较早版本的MySQL,则可以使用TRIGGERs执行此操作
CREATE TRIGGER MySlugIns BEFORE INSERT ON MyTable
FOR EACH ROW SET slug = SHA2(CONCAT(name, description));
CREATE TRIGGER MySlugUpd BEFORE UPDATE ON MyTable
FOR EACH ROW SET slug = SHA2(CONCAT(name, description), 256);发布于 2019-05-21 12:35:37
注意,如果输入中的任何一列为NULL,则concat将返回NULL。因此,要以空安全的方式进行散列,请使用concat_ws。例如:
select md5(concat_ws('', col_1, .. , col_n));发布于 2016-08-03 08:04:41
使用MySQL的CONCAT()合并这两个值,并使用SHA2()生成256bit的哈希值。
CREATE TABLE IF NOT EXISTS `mytable` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`description` varchar(50) NOT NULL,
`slug` varchar(64) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `mytable` (`name`,`description`,`slug`)
VALUES ('Fred','A Person',SHA2(CONCAT(`name`,`description`),256));
SELECT * FROM `mytable`输出:
COLUMN VALUE
id 1
name Fred
description A Person
slug ea76b5b09b0e004781b569f88fc8434fe25ae3ad17807904cfb975a3be71bd89在SQLfiddle上试试吧。
https://stackoverflow.com/questions/38732185
复制相似问题