|
|
|
|
|
для: cheops
(29.09.2012 в 07:40)
| | Это при апдейте. А тут была проблема в том, что апдейт не срабатывал. | |
|
|
|
|
|
|
|
для: Sfinks
(28.09.2012 в 11:16)
| | Об триггерах следует знать вот еще какую вещь, помимо NEW.parameter1 у вас есть старое значение OLD.parameter1, поэтому вы всегда можете подставить старые значения. | |
|
|
|
|
|
|
|
для: Sfinks
(28.09.2012 в 11:16)
| | Выкрутился, совместив и "INSERT ... ON DUPLICATE KEY UPDATE" и "CREATE TRIGGER ... BEFORE INSERT"!
/*<?*/
CREATE TRIGGER `productBeforeInsert` BEFORE INSERT ON `product`
FOR EACH ROW BEGIN
/* чтобы не делать лишних телодвижений выполняю всю обработку только если проблемное поле IS NULL */
IF NEW.product_color IS NULL THEN
/* Проверяю есть ли уже в интересующей выборке запись в которой проблемное поле IS NULL */
SELECT count(*) INTO @co FROM product WHERE price_id=NEW.price_id AND product_color IS NULL;
/* ...если есть... */
IF @co > 0 THEN
/* то определяю значение PRIMARY KEY этой записи */
SELECT product_id INTO @id FROM product WHERE price_id=NEW.price_id AND product_color IS NULL;
/* и присваиваю его значению PRIMARY KEY добавляемой записи */
SET NEW.product_id = @id;
/* вынуждая тем самым сработать ON DUPLICATE KEY UPDATE */
END IF;
END IF;
END
|
Получилось красиво =)))
[UPD] А еще красивее будет убрать лишнюю проверку, т.к. если подходящей строки нет, то @id IS NULL =)
/*<?*/
CREATE TRIGGER `productBeforeInsert` BEFORE INSERT ON `product`
FOR EACH ROW BEGIN
IF NEW.product_color IS NULL THEN
SELECT product_id INTO @id FROM product WHERE price_id=NEW.price_id AND product_color IS NULL;
SET NEW.product_id = coalesce(@id,NEW.product_id);
END IF;
END
|
| |
|
|
|
|
|
|
|
для: cheops
(28.09.2012 в 11:07)
| | И еще вопрос.
Можно отменить действие по умолчанию вызвавшее триггер? Как в JS: return false;
Например как написать такое:
CREATE TRIGGER insertPosition BEFORE INSERT
ON position FOR EACH ROW
BEGIN
SET @par1 = NEW.parameter1;
SET @par2 = NEW.parameter2;
Если есть запись с parameter1=@par1 и parameter2=@par2, то{
установить значение ее поля status='active'
не добавлять новую запись
}
иначе{
Добавить запись
}
END
|
Другими словами аналог "INSERT ... ON DUPLICATE KEY UPDATE", но триггером.
Это возможно?
[UPD]
"INSERT ... ON DUPLICATE KEY UPDATE" -это конечно хорошо, но не срабатывает, когда UNIQUE KEY составной и одно из добавляемых полей IS NULL. Дубликаты вставляются.
Допустим отменить добавление новой записи можно задав одному из полей не допустимое значение, например NEW.field1=null для поля которое не может быть null.
Или есть человеческий (не извращенский) способ? | |
|
|
|
|
|
|
|
для: Sfinks
(28.09.2012 в 10:04)
| | Да, должен. | |
|
|
|
|
|
|
|
для: Sfinks
(26.09.2012 в 19:46)
| | А триггеры вызывают цепную реакцию?
В смысле при срабатывании триггера AFTER INSERT одной таблицы происходит UPDATE другой, на которой, в свою очередь, стоит BEFORE UPDATE.
Он тоже сработает? | |
|
|
|
|
|
|
|
для: cheops
(26.09.2012 в 17:39)
| | Ага, понятно!
Ну теперь и со всеми остальными статьями будет яснее!
Спасибо =) | |
|
|
|
|
|
|
|
для: Sfinks
(26.09.2012 в 16:15)
| | Можно через информационную схему, можно через SHOW TRIGGERS, удалить можно через DROP TRIGGER, редактирование не предусмотрено (если только в новые версии не добавили). | |
|
|
|
|
|
|
|
для: cheops
(26.09.2012 в 14:50)
| | Тьфу ты ё моё =))) Вот в чем дело! =)))))) Ну тады понятно! Спасибо!
[UPD] А как теперь можно посмотреть что на базу навешано, какие процедуры и т.п.?
И если нужно изменить, есть какой-то ALTER/UPDATE для тригеров или просто CREATE одноименный? | |
|
|
|
|
|
|
|
для: Sfinks
(26.09.2012 в 14:09)
| | Ему не нравится разделитель ;, которым пестрит тело триггера, в PMA внизу есть поле "Разделитель", поместите туда что угодно, кроме ; для выполнения триггера. Тогда тело триггер будет восприниматься как единый оператор. Если помимо триггера нужно выполнить еще какие-то запросы, то они должны заканчиваться разделителем, который вы указали в поле "Разделитель". | |
|
|
|
|