MySQL数据库 如果触发器不存在 创建
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL数据库 如果触发器不存在 创建相关的知识,希望对你有一定的参考价值。
create trigger if not exists trigger_name before insert on tablename for each row begin end这个报语法错误 说是语法有问题 求助
这里创建了一个Channel的实例对象。Channel对象被创建时,同时会创建一个重要的对象,就是ChannelPipeline,Netty:ChannelPipeline。经过上面一系列的动作,Channel就被创建好了。下面就看看他是怎样通过socket连接的。 参考技术A create trigger trigger_name before insert on tablename for each row
begin
//当执行insert 时: insert into tablename values(1); 会执行触发器trigger_name.开始执行
。。。。;
//执行结束
end;
如果存在 MySQL 触发器语法错误
【中文标题】如果存在 MySQL 触发器语法错误【英文标题】:MySQL Trigger Syntax Error IF Exists 【发布时间】:2013-11-05 19:40:48 【问题描述】:我正在尝试创建一个 MySQL 触发器,但语法不正确。
触发器应该通过并匹配一组关键字与插入数据库的新帖子的标题。如果找到匹配项,则应将新帖子分配给该存储桶并更新存储桶的关键字集。如果未找到匹配项,则应使用帖子中的值创建一个新存储桶。错误指向以 IF EXISTS 开头的行,但我不知道出了什么问题。任何帮助将不胜感激。谢谢!
更新:代码已更新为退出 IF EXISTS,但现在从 ELSE 语句开始出现错误。
delimiter $$
CREATE TRIGGER bucket_trigger_v1 BEFORE INSERT ON posts
FOR EACH ROW
BEGIN
set @target = NEW.post_title;
set @bucket_id_number = '';
set @bucket_relevance = '';
SELECT idbuckets, MATCH (keywords) AGAINST (@target) AS score INTO @bucket_id_number, @bucket_relevance FROM buckets WHERE MATCH (keywords) AGAINST (@target) ORDER BY score DESC LIMIT 1;
IF (@bucket_id_number != '') THEN
BEGIN
SET NEW.buckets_idbuckets = @bucket_id_number;
UPDATE buckets SET keywords = concat(keywords, @target) WHERE idbuckets = @bucket_id_number;
END
ELSE
BEGIN
INSERT INTO buckets (idbuckets, keywords, creationdate) VALUES (, @target, NEW.postdate);
SET NEW.bucket_idbuckets = (SELECT LAST_INSERT_ID());
END
END IF;
END;
$$
【问题讨论】:
【参考方案1】:需要考虑的几点:
13.2.9.1. SELECT ... INTO Syntax
不应在嵌套的 SELECT 中使用 INTO 子句,因为这样的 SELECT 必须将其结果返回到外部上下文。
19.3.1. Trigger Syntax and Examples
这样的 SET 语句在 AFTER 触发器中无效,因为行更改已经发生。
更新
以下代码正确地创建了触发器。 posts
表的创建只是为了创建触发器。
/*Table structure for table `posts` */
DROP TABLE IF EXISTS `posts`;
CREATE TABLE `posts` (
`post_title` VARCHAR(500) DEFAULT NULL,
`buckets_idbuckets` INT(11) DEFAULT NULL,
`postdate` DATETIME DEFAULT NULL
) ENGINE=INNODB;
/* Trigger structure for table `posts` */
DELIMITER $$
/*!50003 DROP TRIGGER*/ /*!50032 IF EXISTS */ /*!50003 `bucket_trigger_v1` */$$
CREATE TRIGGER `bucket_trigger_v1` BEFORE INSERT ON `posts`
FOR EACH ROW
BEGIN
SET @target := new.`post_title`;
SET @bucket_id_number := '';
SET @bucket_relevance := '';
SELECT `idbuckets`, MATCH (`keywords`) AGAINST (@target) AS `score` INTO @bucket_id_number, @bucket_relevance FROM `buckets` WHERE MATCH (`keywords`) AGAINST (@target) ORDER BY `score` DESC LIMIT 1;
IF (@bucket_id_number != '') THEN
SET new.`buckets_idbuckets` := @bucket_id_number;
UPDATE `buckets` SET `keywords` = CONCAT(`keywords`, @target) WHERE `idbuckets` = @bucket_id_number;
ELSE
INSERT INTO `buckets` (`keywords`, `creationdate`) VALUES (@target, new.`postdate`);
SET new.`buckets_idbuckets` := LAST_INSERT_ID();
END IF;
END$$
DELIMITER ;
【讨论】:
我更新了代码以删除 into 子句,但现在我在代码的 ELSE 部分遇到另一个错误。感谢您的帮助。INSERT
语句有错误,缺少要插入的第一个值。
该值是一个 AUTO_INCREMENT 列。我需要在那里放一些具体的东西吗?我以为它会自动填充。
类似下面的句子也应该可以工作:INSERT INTO buckets (keywords, creationdate) VALUES (@target, NEW.postdate);
欣赏它,我想我想通了。我会发布答案。【参考方案2】:
MySQL,或者至少是我正在运行的版本,不能同时处理多个触发器。因此,IF 语句不适用于 BEGIN 和 END,因此我必须找到不同的解决方案。
【讨论】:
以上是关于MySQL数据库 如果触发器不存在 创建的主要内容,如果未能解决你的问题,请参考以下文章
MySQL #1422 存储函数或触发器中不允许显式或隐式提交