2016-01-21 2 views
0

Вот мой спусковой крючок.Триггер не работает все время

CREATE TRIGGER `data_temp_after_insert` AFTER INSERT ON `data_temp` 
FOR EACH ROW 

BEGIN 

    DECLARE nextInc INT DEFAULT 0; // I have try to define AS a varchar... 
    DECLARE idrad varchar(75); 
    DECLARE idio_bat varchar(75); 
    DECLARE UniqueID varchar(75); 
    DECLARE ServerID varchar(75); 

    SELECT IDRadio INTO idrad FROM radio WHERE radio.XB_SL=NEW.XB_SL AND Actif=1 LIMIT 1; 
    SELECT ID_IO INTO idio_bat FROM io WHERE io.IDRadio=idrad AND NoIO=1 AND Actif=1 LIMIT 1; 

    SELECT IDServerInfo INTO ServerID FROM serverinfo WHERE Actif=1; 

    SELECT AUTO_INCREMENT INTO nextInc FROM information_schema.tables WHERE table_name = 'io_data' AND table_schema = DATABASE() ; 

    SET UniqueID = CONCAT(ServerID,'-',nextInc); 

    IF NEW.Battery IS NOT NULL AND idio_bat IS NOT NULL AND idio_bat != 0 THEN 
     UPDATE io_data SET ValueRead=1, DateModification=now() WHERE ID_IO=idio_bat AND ValueRead=0 AND Actif=1; 
     INSERT INTO io_data (ID_IO_Data, ID_IO, ReadingValue, Timestamp) 
      VALUES (UniqueID, idio_bat, NEW.Battery, NEW.Timestamp); 
    END IF; 

END 

Вот вставка запроса в data_temp (на котором установлен триггер)

INSERT INTO data_temp (XB_SL, HType, Battery, Temperature, Value_1, Value_2, Value_3) VALUES ('1086507849', '2', 22, -23, -0.9, -4.6, -4.9); 

Вот io_data структура таблицы:

ID_IO_Data varchar(75) 
No  int  AUTO_INCREMENT 
ID_IO  varchar(75) 
ReadingValue decimal(5,2) 
Timestamp timestamp CURRENT_TIMESTAMP  
ValueRead int 

У меня 2 Differents ситуации.

Тот, который работает: (обновление в io_data, а также вставка)

IDServerInfo (определено как 75 VarChar) является значением 230000-A8754126-8B0D-4D68-A20A-7F97EDE1CE43

Итак, каждый созданный идентификатор использует этот IDServerInfo, объединенный с автоинкрементами для таблицы (определите как varchar 75).

При заполнении данных в таблице data_temp с этим IDServerInfo все работает хорошо.

Путь, который не работает:.

Единственное различие в настройках, что IDServerInfo содержит букву первого символа (например Z 23000-A8754126-8B0D-4D68-A20A- 7F97EDE1CE43) (Я пробовал Z 230000-A8754126-8B0D-4D68-A20A-7F97EDE1CE43 и не работает тоже)

Любой человек может помочь? У вас достаточно информации, чтобы понять, что я делаю неправильно?


UPDATE

Я попытался с несколькими различными IDServerInfo

Все эти один не работают

Z230000-

Z23000-

ZZZZZZZ-

ZZZ111-

A123456-


Те одна работа!

230000Z

1ZZZZZZ

111ZZZ

Таким образом, если первый символ является буквой, она не работает!

ответ

0

Я не знаю, почему именно, но я нашел ошибку, и это было в состоянии, если:

CREATE TRIGGER `data_temp_after_insert` AFTER INSERT ON `data_temp` 
FOR EACH ROW 

BEGIN 

DECLARE nextInc INT DEFAULT 0; // I have try to define AS a varchar... 
DECLARE idrad varchar(75); 
DECLARE idio_bat varchar(75); 
DECLARE UniqueID varchar(75); 
DECLARE ServerID varchar(75); 

SELECT IDRadio INTO idrad FROM radio WHERE radio.XB_SL=NEW.XB_SL AND Actif=1 LIMIT 1; 
SELECT ID_IO INTO idio_bat FROM io WHERE io.IDRadio=idrad AND NoIO=1 AND Actif=1 LIMIT 1; 

SELECT IDServerInfo INTO ServerID FROM serverinfo WHERE Actif=1; 

SELECT AUTO_INCREMENT INTO nextInc FROM information_schema.tables WHERE table_name = 'io_data' AND table_schema = DATABASE() ; 

SET UniqueID = CONCAT(ServerID,'-',nextInc); 

IF NEW.Battery IS NOT NULL AND idio_bat IS NOT NULL AND idio_bat != 0 THEN 
    UPDATE io_data SET ValueRead=1, DateModification=now() WHERE ID_IO=idio_bat AND ValueRead=0 AND Actif=1; 
    INSERT INTO io_data (ID_IO_Data, ID_IO, ReadingValue, Timestamp) 
     VALUES (UniqueID, idio_bat, NEW.Battery, NEW.Timestamp); 
END IF; 

END

0 в этом состоянии: idio_bat = 0 должно быть между quote =>

IF NEW.Battery IS NOT NULL AND idio_bat IS NOT NULL AND idio_bat != "0"