【问题标题】:How can i create a trigger to verify if a record exists on another table?如何创建触发器来验证另一个表上是否存在记录?
【发布时间】:2013-11-30 17:34:43
【问题描述】:

我使用的是 mysql 5.0 版。

我正在尝试创建一个触发器来检查另一个表中是否存在一个条目(食物名称)。

我已经这样做了:

delimiter //
CREATE TRIGGER verifyExists BEFORE INSERT ON Sold
    FOR EACH ROW
    BEGIN
        IF NEW.nameF not in (
            select A.nameF
            From Available D
            where (NEW.nameF = A.nameF and NEW.nameR = A.nameR)
        )
        END IF;
    END;
//
delimiter ; 

这不起作用,为什么?

【问题讨论】:

  • 您的触发器实际上并没有做任何事情。你的IF 没有THEN
  • 这不是外键约束的用途吗?
  • 现在我有,但没有工作.. hobbs,我知道,但我需要创建它

标签: mysql


【解决方案1】:

你有几个错误:

delimiter //
CREATE TRIGGER verifyExists BEFORE INSERT ON Sold
    FOR EACH ROW
    BEGIN
        IF NEW.nameF not in (
            select A.nameF
            From Available A  -- CHANGED THE ALIAS TO A
            where (NEW.nameF = A.nameF and NEW.nameR = A.nameR)
        ) THEN -- MISSING THEN
           CALL `Insert not allowed`;

        END IF;
    END;
//
delimiter ; 

sqlfiddle demo

如果你可以使用SIGNAL,这是最好的方法,但由于它只在mysql 5.5中引入,你将不得不通过其他途径来做到这一点。一种方法是调用不存在的函数,如上所示。来自this answer

【讨论】:

  • 当表格中没有名字时,我想告诉用户问题并且不要在表格中插入.. 有可能吗?
  • 我在尝试运行时遇到了这个问题:ERROR 1064 (42000): You have an error in your SQL syntax;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“分隔符//CREATE TRIGGER verifyExists BEFORE INSERT ON Sold FOR EACH ROW”附近使用正确的语法
  • @user3046650。是的。之后我看到您使用的是不支持 SIGNAL 的 mysql 版本,这是执行此操作的方法,但我添加了一种取消插入的方法。通过在 sold 中插入 (2,2) 来尝试使用 sqlfiddle。
  • 数据库检索错误 1305(42000) PROCEDURE Insert not aloowed doesent exists :/ i use Server version: 5.1.72-2-log (Debian)
  • @user3046650。每当您尝试插入一个不允许的值时,就会出现这种错误。
猜你喜欢
  • 2013-12-03
  • 1970-01-01
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多