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

标签 mysql triggers

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

我尝试做的插入是这样的:

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 ; 

任何有关我为何收到此错误的帮助都将非常感激。

-丹

最佳答案

在这些行中

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 而不是使用子查询还有一些改进的空间

关于MySql插入具有触发器的表时出现错误1054,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16777794/

相关文章:

mysql - 在InnoDB中,所有的sql都在事务中吗?

PostgreSQL 使用变量名作为字符串文字

sql - TSQL更新触发器: joining inserted and deleted

MySQL 触发器 - 获取 json 字段的新旧值之间的差异

MYSQL QUERY 如果存在则获取该特定列值并与新值进行比较

c# - 不确定如何根据解决方案配置设置 C# 连接字符串

php - 第 35 行出现意外的文件结束错误

php - 如何在 MySQL 中查找所有子行?

php - 无法连接MySQL数据库,但可以连接服务器

ios - PWA iOS 启动画面上的触发事件