如何使用触发器生成字段的值?

Posted

技术标签:

【中文标题】如何使用触发器生成字段的值?【英文标题】:How to generate value of a field using trigger? 【发布时间】:2015-05-28 15:45:23 【问题描述】:

我需要在 mysql 中编写一个触发器,以确保每当向表中插入新行时,其中一个字段的值将由其他字段的值组合生成的特定值填充。

如您所见,我首先需要将名称字段中的所有空格替换为 -,然后将其与 - 和电话字段的值连接,最后将结果放入昵称字段。

触发器

The following query has failed: "CREATE DEFINER=`root`@`localhost` 
TRIGGER `generatenickname` BEFORE INSERT ON `Users` 
FOR EACH ROW 
DECLARE temp = REPLACE(NEW.name, " ", "-"); 
SET NEW.nickname = concat(temp + '-' + NEW.phone);"
MySQL said: #1064 - You have an error in your SQL syntax; check the 
manual that corresponds to your MySQL server version for the right 
syntax to use near 'DECLARE temp = REPLACE(NEW.name, " ", "-"); SET 
NEW.nickname = concat(t' at line 1

如果我用 BEGIN 和 END 包围它;并删除“FOR EACH ROW”,它不会显示错误,而是在昵称字段中输入 0。

【问题讨论】:

【参考方案1】:

您的触发器包含多个语句,因此您需要将它们包含在 BEGIN...END 块中。

参考文档: http://dev.mysql.com/doc/refman/5.6/en/create-trigger.html http://dev.mysql.com/doc/refman/5.6/en/trigger-syntax.html

【讨论】:

我把 BEGIN 放在 "For EACH ROW" 和 END 之前;在触发器结束时,但仍然返回相同的错误。【参考方案2】:

试试这个,它可以解决你的问题。

DELIMITER $$
CREATE TRIGGER  `generatenickname` BEFORE INSERT ON `Users` 
FOR EACH ROW 
BEGIN
SET NEW.NAME = CONCAT(REPLACE(NEW.name, " ", "-") , '-' , NEW.phone);
END;
$$
DELIMITER ;

【讨论】:

谢谢,那为什么声明一个新变量不起作用呢?

以上是关于如何使用触发器生成字段的值?的主要内容,如果未能解决你的问题,请参考以下文章

如何得到SqlServer的自增ID

使用 FireDac TFDCommand 对 autoinc 字段执行插入操作并检索生成的值

如何在 PL/pgSQL 中获取动态生成的字段名称的值

如何在更新触发器中记录更改的值

oracle update触发器如何获取被修改的字段

visual studio编写c#项目,建立sql数据库,如何让表中某一列的值自动生成,不重复,例如从1开始自动加1。