【问题标题】:Trigger Preventing Record Insertion触发器防止记录插入
【发布时间】:2016-05-03 23:02:48
【问题描述】:

我正在尝试创建触发器,该触发器可以使用表 user_info 的 u_count 的值更新表 user_details 的列 user_count 的值。

CREATE TRIGGER `test` 
AFTER INSERT ON `user_details` FOR EACH ROW 
BEGIN 
   DECLARE default_user_count int(11); 
   SELECT u_count INTO @default_user_count FROM 
   user_info WHERE user_info.id= user_details.id_c; 
   IF user_details.user_count= 0 
       THEN UPDATE user_details SET 
       user_count = default_user_count 
       WHERE user_details.id_c = user_info.id; 
  END IF; 
END

触发器已成功保存,但是当我尝试在两个表中插入值时,它阻止将记录插入 user_details 意味着在此表 2 中没有插入任何行,如果我们删除触发器则它可以工作。

谁能告诉我这个触发器有问题吗?

谢谢, M.

【问题讨论】:

  • 不允许在该表的触发器中修改该表的内容。
  • 触发器出了什么问题是相当明显的......但是很难理解你实际上想要做什么,以及为什么......如果数据存在于一个表中,你通常应该当你需要它时(稍后)通过连接来获取它......而不是通过复制它。
  • @Michael:我无权访问核心文件,因此无法在代码中进行更改。这就是为什么我试图在插入后创建触发器。

标签: mysql triggers eventtrigger


【解决方案1】:

目前还不清楚您要完成什么,但它似乎类似于我们下面的内容。

您的触发器中有许多错误和歧义。

  • 变量混淆 -- DECLARE default_user_count INT(11); 声明用户定义变量@default_user_count。它声明了程序变量default_user_count@ 前缀引用了完全不同的变量范围和命名空间。

  • 调用触发器的表中的SELECTUPDATE 通常没有意义(SELECT)或完全无效(UPDATE)。

  • 在触发器中,您正在操作FOR EACH ROW——也就是说,对于调用触发器的语句中包含的每一行。在INSERT 触发器中,行的NEW 值位于可通过别名NEW 访问的伪表/伪行中。对于UPDATE 触发器,有NEWOLD 行值,对于DELETE 触发器,只有OLD

  • AFTER INSERT 似乎没有意义。我认为您正在寻找BEFORE INSERT - 也就是说,在处理INSERT INTO ... 查询时,新插入的行实际上被写入表中之前,相应地修改其值。结果行包含原始值,但触发器已对其进行了修改。

  • SELECT ... INTO 变量是一种你不应该养成的习惯,因为it can bite you in a way a scalar subquery can't 会意外地保持变量不变,而不是像预期的那样将其设置为NULL。在这种情况下,它不会有任何区别,但它仍然值得一提......在这种情况下,我已经完全消除了那个中间变量,所以子查询是唯一的选择。

如果您尝试使用在另一个表中找到的值来设置此表中的值,您需要做的就是SET NEW.column_name 等于您希望在行中使用的值,而不是插入语句提供的值.

CREATE TRIGGER `test` 
BEFORE INSERT ON `user_details` FOR EACH ROW 
BEGIN 
   IF NEW.user_count = 0 /* maybe also >> */ OR NEW.user_count IS NULL /* << this */ THEN
     SET NEW.user_count = (SELECT ui.u_count 
                             FROM user_info ui
                            WHERE ui.id = NEW.id_c);
   END IF;
END 

同样,根据原始问题的内容,尚不清楚这两个表是如何连接的,但这似乎可以完成您想要完成的工作。

【讨论】:

    猜你喜欢
    • 2013-10-12
    • 2017-04-26
    • 2011-05-14
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 2013-06-11
    相关资源
    最近更新 更多