автоматическое преобразование 0 или пустой строки в NULL - PullRequest
3 голосов
/ 30 июня 2011

[в MySQL]
Есть ли способ ограничить любое поле, чтобы оно не было 0, и если я получил значение 0, преобразуйте его в NULL.
Например, два продукта не могут иметь одинаковый серийный номер, но товар вообще может быть без серийного номера.
Я сейчас использую это: (для нескольких полей)

CREATE TABLE products (
    sn DECIMAL(8,2),
    UNIQE (sn),
    ...........
) ENGINE=InnoDB;
CREATE TRIGGER prod_zero1 BEFORE UPDATE ON products FOR EACH ROW
    SET NEW.sn=NULLIF(NEW.sn,0);

Есть ли более короткий \ быстрый способ, как это сделать?
Другая проблема состоит в том, что когда я пытаюсь использовать это для нескольких полей в одной таблице, я получаю massege:

CREATE TRIGGER prod_zero2 BEFORE UPDATE ON products FOR EACH ROW
    SET NEW.name=NULLIF(NEW.name,"");
ERROR 1235 (42000): This version of MySQL doesn't yet support 'multiple triggers with the same action time and event for one table'

Спасибо

Ответы [ 2 ]

2 голосов
/ 30 июня 2011

Не используйте несколько триггеров, используйте один триггер, который заботится обо всех полях

CREATE TRIGGER prod_zero2 BEFORE UPDATE ON products FOR EACH ROW
BEGIN
SET NEW.sn=NULLIF(NEW.sn,0);
SET NEW.name=NULLIF(NEW.name,"");
END;
0 голосов
/ 30 июня 2011

Вы можете сделать это в одном триггере.

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

DELIMITER $$

DROP TRIGGER IF EXISTS tr_b_upd_products $$

CREATE TRIGGER tr_b_upd_products BEFORE UPDATE ON products FOR EACH ROW BEGIN
  IF (NEW.sn = 0)
  THEN
    SET NEW.sn=NULL;
  END IF;

  IF (NEW.name = '')
  THEN
    SET NEW.name=NULL;
  END IF;
END $$

DELIMITER ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...