Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Процедуры, функции, тригеры

Сообщения:  [1-10]   [11-15] 

 
 автор: Sfinks   (29.09.2012 в 08:44)   письмо автору
 
   для: cheops   (29.09.2012 в 07:40)
 

Это при апдейте. А тут была проблема в том, что апдейт не срабатывал.

  Ответить  
 
 автор: cheops   (29.09.2012 в 07:40)   письмо автору
 
   для: Sfinks   (28.09.2012 в 11:16)
 

Об триггерах следует знать вот еще какую вещь, помимо NEW.parameter1 у вас есть старое значение OLD.parameter1, поэтому вы всегда можете подставить старые значения.

  Ответить  
 
 автор: Sfinks   (28.09.2012 в 23:04)   письмо автору
 
   для: Sfinks   (28.09.2012 в 11:16)
 

Выкрутился, совместив и "INSERT ... ON DUPLICATE KEY UPDATE" и "CREATE TRIGGER ... BEFORE INSERT"!
/*<?*/
CREATE TRIGGER `productBeforeInsertBEFORE 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 `productBeforeInsertBEFORE 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

  Ответить  
 
 автор: Sfinks   (28.09.2012 в 11:16)   письмо автору
 
   для: 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.
Или есть человеческий (не извращенский) способ?

  Ответить  
 
 автор: cheops   (28.09.2012 в 11:07)   письмо автору
 
   для: Sfinks   (28.09.2012 в 10:04)
 

Да, должен.

  Ответить  
 
 автор: Sfinks   (28.09.2012 в 10:04)   письмо автору
 
   для: Sfinks   (26.09.2012 в 19:46)
 

А триггеры вызывают цепную реакцию?
В смысле при срабатывании триггера AFTER INSERT одной таблицы происходит UPDATE другой, на которой, в свою очередь, стоит BEFORE UPDATE.
Он тоже сработает?

  Ответить  
 
 автор: Sfinks   (26.09.2012 в 19:46)   письмо автору
 
   для: cheops   (26.09.2012 в 17:39)
 

Ага, понятно!
Ну теперь и со всеми остальными статьями будет яснее!
Спасибо =)

  Ответить  
 
 автор: cheops   (26.09.2012 в 17:39)   письмо автору
 
   для: Sfinks   (26.09.2012 в 16:15)
 

Можно через информационную схему, можно через SHOW TRIGGERS, удалить можно через DROP TRIGGER, редактирование не предусмотрено (если только в новые версии не добавили).

  Ответить  
 
 автор: Sfinks   (26.09.2012 в 16:15)   письмо автору
 
   для: cheops   (26.09.2012 в 14:50)
 

Тьфу ты ё моё =))) Вот в чем дело! =)))))) Ну тады понятно! Спасибо!

[UPD] А как теперь можно посмотреть что на базу навешано, какие процедуры и т.п.?
И если нужно изменить, есть какой-то ALTER/UPDATE для тригеров или просто CREATE одноименный?

  Ответить  
 
 автор: cheops   (26.09.2012 в 14:50)   письмо автору
 
   для: Sfinks   (26.09.2012 в 14:09)
 

Ему не нравится разделитель ;, которым пестрит тело триггера, в PMA внизу есть поле "Разделитель", поместите туда что угодно, кроме ; для выполнения триггера. Тогда тело триггер будет восприниматься как единый оператор. Если помимо триггера нужно выполнить еще какие-то запросы, то они должны заканчиваться разделителем, который вы указали в поле "Разделитель".

  Ответить  

Сообщения:  [1-10]   [11-15] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования