Пуски когда поле не включено - PullRequest
0 голосов
/ 28 сентября 2018

Я работаю над базой данных MySQL и раньше я не слишком много делал с триггерами, но нашел конкретный сценарий, в котором я их использую.Я сталкиваюсь с чем-то странным, хотя.Короче говоря, мой триггер не влияет на определенное поле, если оно не указано.Я надеюсь, что кто-то может исправить это так, чтобы это всегда происходило.

Вот пример кода

DROP TABLE IF EXISTS reservations;
CREATE TABLE reservations(
    resid int(8) NOT NULL AUTO_INCREMENT,
    siteid int(5),
    camperid int(8),
    charge decimal(10,2),
    checkin datetime NOT NULL,
    checkout datetime NOT NULL,
    balance decimal(10,2),
    PRIMARY KEY (resid),
    FOREIGN KEY (siteid) REFERENCES sites(siteid),
    FOREIGN KEY (camperid) REFERENCES campers(camperid)
);

Теперь триггер

DELIMETER //
CREATE TRIGGER balanceCheck BEFORE INSERT ON reservations 
FOR EACH ROW 
BEGIN 
   IF NEW.balance != NEW.charge THEN SET NEW.balance = NEW.charge; END IF; 
END;// --this isn't working yet
DELIMETER;

Вот SQL, которыйтриггер не перехватывает

INSERT INTO reservations (resid, siteid, camperid, charge, checkin, checkout)
VALUES (1, 1, 1, 90, '2016-04-10 13:00:00', '2016-04-12 15:00:00');

Вот SQL, который триггер перехватывает

INSERT INTO reservations (resid, siteid, camperid, charge, checkin, checkout, balance) 
VALUES (2, 1, 1, 90, '2016-04-10 13:00:00', '2016-04-12 15:00:00', 9);

Кажется, зависит от того, ссылаюсь ли я на поле эффекта или нет, если триггер может повлиять на него,Как я могу сделать так, чтобы поле баланса всегда действовало, даже если оно не указано?Я хотел бы сохранить это решение, используя триггер, если это возможно.

1 Ответ

0 голосов
/ 29 сентября 2018

Поскольку new.balance равно NULL для первого INSERT, NEW.balance != NEW.charge не соответствует действительности.Операции равенства или неравенства на NULL выходят как NULL, что неверно, то есть, другими словами, ложно.Следовательно, THEN ветвь IF не введена.

Из руководства :

(...)

Нельзя использовать операторы арифметического сравнения, такие как =, < или <>, чтобы проверить NULL.

(...)

, посколькурезультат любого арифметического сравнения с NULL также равен NULL, вы не можете получить какие-либо значимые результаты таких сравнений.В MySQL 0 или NULL означает ложь, а все остальное означает истину.

(...)

Но в MySQL вы можете использовать NULL -защищенный оператор равенства <=>.

CREATE TRIGGER balanceCheck
               BEFORE INSERT
               ON reservations
               FOR EACH ROW
BEGIN
  IF NOT NEW.balance <=> NEW.charge THEN
    SET NEW.balance = NEW.charge;
  END IF;
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...