【问题标题】:Mysql trigger to insert the row if not exist in table but doesn't work如果表中不存在,则Mysql触发器插入行但不起作用
【发布时间】:2019-07-23 09:49:51
【问题描述】:

我正在尝试创建一个触发器来检查是否创建了具有相同主题和对象名称的行。如果没有,我想插入它,否则我会显示一条错误消息。

我查阅了一些示例并编写了下面的代码,但有一些错误。

DELIMITER $$
CREATE TRIGGER insertOnceKB BEFORE INSERT ON knowledgebase FOR EACH ROW
BEGIN
IF NEW.Object, NEW.Subject, NEW.Predicate not in 
(SELECT A.Object, A.Subject, A.Predicate FROM knowledgebase as A 
 where (NEW.Object = A.Object and NEW.Subject = A.Subject and NEW.Predicate = A.Predicate)) THEN
    INSERT INTO knowledgebase (Object,Predicate,Subject,Count,botID,Source,EntityTypeID)
        VALUES ( NEW.Object, NEW.Predicate, NEW.Subject, NEW.Count, NEW.botID, NEW.Source, NEW.EntityTypeID);
THEN
    CALL `Insert not allowed`;
END IF;
END $$
DELIMITER ;

这是 Xampp 服务器显示的错误消息:

1064 - 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册以了解正确的语法使用

near ' NEW.Subject, NEW.Predicate 不在 (SELECT A.Object, A.Subject, A.第 3 行的谓词 FR'

【问题讨论】:

  • 你的第二个 THEN 应该是一个 else 并且建议你声明一些变量并将选择移出 if 语句修改它以插入变量并测试变量或将测试更改为存在/不存在测试。无论哪种方式,样本数据都是有用的。插入的目的是什么 - 你不能插入到触发触发器的表中..
  • 插入是对的。如何在插入之前检查 db 上是否已经存在相同的值?谢谢。

标签: mysql triggers


【解决方案1】:

这句话

IF NEW.Object, NEW.Subject, NEW.Predicate not in (SELECT A.Object, A.Subject, A.Predicate FROM knowledgebase as A where (NEW.Object = A.Object and NEW.Subject = A.Subject and NEW.Predicate = A.Predicate))

错了,即使成功了,我认为触发器不会允许查询您将要插入的表,但无论如何,

你可以这样做

if exists( select * from knowledgebase as a where new.Subject = a.Subject and new.Predicate = a.Predicate and new.Object = a.Object ) then
 return bla bla bla;
else if
 do whatever you were doing...
end if

【讨论】:

  • 谢谢,“我认为触发器不允许查询您将要插入的表”这是真的,它不允许。怎么查?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-20
  • 2013-02-08
  • 2014-04-14
  • 2018-03-16
  • 2019-08-28
  • 2018-02-05
相关资源
最近更新 更多