插入具有触发器的表时,MySql错误1054

时间:2013-05-27 17:18:00

标签: mysql triggers

我在表上创建了一个触发器,当我尝试向其中插入数据时,我得到MySql错误“错误代码:1054'字段列表中的未知列license_key'”

我试图做的INSERT就是:

INSERT INTO LOAD_MASTER(license_key, state, total_pageviews, total_visitors, max_visitors, max_pageviews, ip, secret, read_time, url)
    VALUES ("order55555hytgtrfderfredfredfredftyu8ikloi98nhygt6", "preparing", 400, 1000, 200, 400, "202,2,35,36", "Hemmeligheden", 120, "http://google.dk");

我创建的触发器应该检查TABLE LOAD_STATS是否存在在LOAD_MASTER表中输入的IP,然后根据结果更改另一个名为LICENSE的表中的值

我的触发器在这里:

    DELIMITER //
CREATE TRIGGER ip_check AFTER INSERT ON LOAD_MASTER FOR EACH ROW
BEGIN
DECLARE MK varchar(50);
DECLARE MIP varchar(15);
DECLARE LID int(6);

    SET MK = license_key;
    SET MIP = ip;
    SET LID = (
        SELECT l.license_id 
        FROM license_keys k, license l 
        WHERE l.license_id = k.license_id 
        AND k.license_key = MK
        );

    IF (SELECT COUNT(DISTICT(master_ip)) FROM LOAD_STATS WHERE master_ip = MIP AND master_key = MK ) > 3 THEN
        UPDATE LICENSE 
        SET STATE = 0 
        WHERE license_id = LID;
    END IF;
END
//
DELIMITER ; 

任何有关我为什么会收到此错误的帮助都会受到很多关注。

-Dan

1 个答案:

答案 0 :(得分:0)

在这些行中

SET MK = license_key;
SET MIP = ip;

您可能打算分别处理NEW.license_keyNEW.ip

恕我直言,你可以做得更简洁。试试这个

DELIMITER //
CREATE TRIGGER ip_check 
AFTER INSERT ON load_master 
FOR EACH ROW
BEGIN
    IF (SELECT COUNT(DISTICT(master_ip)) 
          FROM load_stats 
         WHERE master_ip = NEW.ip 
           AND master_key = NEW.license_key ) > 3 THEN
        UPDATE license 
           SET state = 0 
         WHERE license_id = 
              (
                SELECT l.license_id 
                  FROM license_keys k JOIN license l 
                    ON l.license_id = k.license_id 
                   AND k.license_key = NEW.license_key
              ); -- make sure that this subquery returns only ONE record
    END IF;
END //
DELIMITER ;

使用JOIN重写UPDATE而不是使用子查询

,还有一定的改进空间