更新

时间:2015-10-04 13:13:59

标签: mysql

我有一张表'用法'具有以下结构:

Job | Start Time | End Time | Session

我还有另一张桌子'会议'使用以下结构来跟踪会话:

Session Label | Start Time | End Time

我希望有一个触发器,当第一个表中有一个条目时,触发器将检查其他表的开始时间和结束时间。如果已存在标签,则需要使用会话标签更新第一个表的会话列,否则应将新条目添加到第二个表中,并将相应的标签输入到第二个表的会话列中。我之前从未使用过SQL触发器,也不知道如何实现这一点。

我试过了:

CREATE TRIGGER test AFTER INSERT ON `usage`
FOR EACH ROW
WHEN (SELECT RIGHT(`usage`.starttime,5) != SELECT RIGHT(`sessions`.starttime,5))
BEGIN
    SET `usage`.sessionlabel = `A`
END;

逻辑:

for(newrecordinusagetable)
{
//check if same starttime exists in any record of session table
if(true)
{
//do nothing
}
else
{
//add the new starttime to the session table
}

PS:不要担心结束时间或标签。

2 个答案:

答案 0 :(得分:2)

以下是基于所提供的有限信息的尝试:

DELIMITER $$

CREATE TRIGGER usage_session_trigger
AFTER INSERT ON `usage`
FOR EACH ROW
    BEGIN
        -- Count sessions with same start time
        DECLARE session_count INT;
        SET session_count = (SELECT COUNT(*)
                             FROM sessions
                             WHERE RIGHT(starttime, 5) = RIGHT(NEW.starttime, 5));

        -- If none found, insert one.
        IF (session_count = 0) THEN
            INSERT INTO sessions (sessionlabel, starttime, endtime)
            VALUES (NEW.`session`, NEW.starttime, NEW.endtime);
        END IF;
    END;
$$

DELIMITER ;

备注

  1. 假设您有充分的理由比较示例中时间的最后5个字符,所以在这里重复一遍。 (虽然不能猜到为什么!)
  2. 可能还需要考虑更新是否需要类似的触发器(+可能删除?)
  3. 我不是在评论你要求做的是正确的做法 - 只是试图回答这个问题。

答案 1 :(得分:0)

从更好的解决方案角度来看,最好在将数据插入使用表时在应用程序逻辑中实现此功能,而不是创建触发器来实现此目的。为了演示你的sceanrio,我使用了一个存储过程插入到使用表中。你可以相应地修改它。

boolean contains(String str){ 
    return Sets.newHashSet(YourEnum.values()).contains(str);
}