【问题标题】:Trigger Before Insert MySql在插入 MySql 之前触发
【发布时间】:2016-02-09 09:32:12
【问题描述】:

插入前我的触发器有问题。 我尝试为一个“id_user”控制表“user_search”的行号,如果此行号> 4,则应删除最旧的行。 我的实际触发是这样的:

DELIMITER $$
CREATE TRIGGER before_insert_user_search 
BEFORE INSERT
ON user_search  FOR EACH ROW 
BEGIN
    DECLARE sDate DATETIME;
    SELECT MIN(date_search) FROM user_search WHERE id_user = NEW.id_user INTO sDate;
    IF ((SELECT COUNT(id) FROM user_search WHERE id_user = NEW.id_user) > 4) THEN
        BEGIN
            DELETE FROM user_search WHERE date_search = sDate;
        END; 
    END IF;
END$$
DELIMITER ;

但是,它不起作用。有人有解决方案来帮助我吗? 谢谢。

【问题讨论】:

    标签: mysql sql triggers


    【解决方案1】:

    在使用 INSERT 触发器时不能删除同一个表行,因为它持有表的。所以尝试编写一个存储过程来插入新记录。

    存储过程应该如下所示:

    CREATE PROCEDURE insert_user_search(new_id_user INT, ......other variable to inert)
    BEGIN
      DECLARE @minId INT;
    
      //INSERT using parameter
    
      SET @minId = SELECT MIN(id) FROM user_search WHERE id_user = new_id_user;
      IF ((SELECT COUNT(id) FROM user_search  WHERE id_user = new_id_user) > 4) THEN
            BEGIN
                DELETE FROM user_search WHERE id_user = @minId;
            END; 
      END IF;
    END;
    

    【讨论】:

    • 感谢您的帮助,但我尝试了您的解决方案,但它不起作用。如果我删除查询限制,触发器将不会有正确的行为。在插入之前,它将删除最旧的 'user_search' 行,而不查看相关的 id_user。就我而言,我的应用程序记录了用户的所有搜索,我不想为每个用户记录更多的 5 次搜索。
    • 不,id_user 是链接在 users(id) 上的外键
    • 这是一个简单的 id 自动递增。表 user_search 由 4 列组成: - id smallint Primary Key - id_user smallint Foreign Key - keyWords varchar - date_search datetime
    猜你喜欢
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-30
    • 1970-01-01
    • 2012-12-11
    • 2016-07-12
    • 1970-01-01
    相关资源
    最近更新 更多