在MariaDB触发器中使用JSON_EXTRACT

时间:2019-11-21 17:01:58

标签: json triggers mariadb

我正在尝试在MariaDB中创建一个INSERT触发器,该触发器使用JSON_EXTRACT作为语句的一部分。 我收到错误消息:

  

第54行的错误1305(42000):FUNCTION NEW.JSON_EXTRACT不   存在。

在文档中,我看不到触发器中JSON使用是否有任何限制。

下面是显示问题的示例。如您所见,选择JSON_EXTRACT可以正常工作。

DROP DATABASE IF EXISTS testdb;

CREATE DATABASE testdb;
USE testdb;

DROP TRIGGER IF EXISTS trig_test;
DROP TRIGGER IF EXISTS trig_works;
DROP TABLE IF EXISTS test1;
DROP TABLE IF EXISTS test2;

CREATE TABLE test1 (
    tstamp DATETIME DEFAULT CURRENT_TIMESTAMP,
    sense VARCHAR(32) NOT NULL,
    readings JSON,
    test_level INT,
    CHECK (JSON_VALID(readings))
);

CREATE TABLE test2 (
    sense VARCHAR(32) NOT NULL,
    battery_level INT
);

INSERT INTO test1 (sense, test_level, readings) VALUES ('ST00', 80, '{ "level" : 73 }');
SELECT test_level, JSON_EXTRACT(readings, '$.level') FROM test1;


INSERT INTO test2 (sense) VALUES ('ST00');

DELIMITER #

CREATE TRIGGER trig_works AFTER INSERT ON test1
FOR EACH ROW
BEGIN
    UPDATE test2
       SET battery_level = NEW.test_level
     WHERE sense = NEW.sense;
END;
#
DELIMITER ;

INSERT INTO test1 (sense, test_level, readings) VALUES ('ST00', 81, '{ "level" : 74 }');
SELECT test_level, JSON_EXTRACT(readings, '$.level') FROM test1;
SELECT * FROM test2;

DELIMITER #

CREATE TRIGGER trig_test AFTER INSERT ON test1
FOR EACH ROW
BEGIN
    UPDATE test2 
       SET battery_level = NEW.JSON_EXTRACT(readings, '$.level')
     WHERE sense = NEW.sense;
END;
#
DELIMITER ;

INSERT INTO test1 (sense, readings) VALUES ('ST00', '{ "level" : 73 }');

SELECT * FROM test2;

DROP TRIGGER IF EXISTS trig_test;
DROP TRIGGER IF EXISTS trig_works;
DROP TABLE IF EXISTS test1;
DROP TABLE IF EXISTS test2;

1 个答案:

答案 0 :(得分:0)

也许处理应该是:(一个小的语法调整)

UPDATE test2 SET battery_level = JSON_EXTRACT(NEW.readings, '$.level');