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

Форум MySQL

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

 

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

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

тема: Как правильно создать триггер

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

 
 автор: LO   (27.03.2007 в 18:26)   письмо автору
 
   для: Trianon   (27.03.2007 в 18:00)
 

проверяла, что бы я не вводила, хоть и допустимые данные мне выдается ошибка
#1146 - Table 'db.NEW' doesn't exist

   
 
 автор: Trianon   (27.03.2007 в 18:00)   письмо автору
 
   для: LO   (27.03.2007 в 16:24)
 

так а вариант

CREATE TRIGGER item_attributes_before_insert BEFORE INSERT ON ppg_item_attributes 
FOR EACH ROW 
BEGIN 
DECLARE isset_attr INT DEFAULT 0; 
SELECT COUNT(item_attributes_id) INTO isset_attr 
     FROM ppg_item_attributes WHERE abbreviation = NEW.abbreviation AND item_id != NEW.item_id; 
  IF (isset_attr > 0) 
  THEN 
    DELETE FROM NEW;
  END IF; 
END

не проходит?

   
 
 автор: LO   (27.03.2007 в 16:24)   письмо автору
 
   для: Trianon   (27.03.2007 в 16:14)
 

Вобщем я сделала так:

CREATE TRIGGER item_attributes_before_insert BEFORE INSERT ON ppg_item_attributes
FOR EACH ROW
BEGIN
DECLARE isset_attr INT DEFAULT 0;
SELECT COUNT(item_attributes_id) INTO isset_attr
     FROM ppg_item_attributes WHERE abbreviation = NEW.abbreviation AND item_id != NEW.item_id;
  IF (isset_attr > 0)
  THEN
    SET NEW.item_id = NULL; 
  END IF;
END

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

   
 
 автор: Trianon   (27.03.2007 в 16:14)   письмо автору
 
   для: LO   (27.03.2007 в 15:58)
 

Само собой. Вы же BEFORE INSERT TRIGGER пишете.

   
 
 автор: LO   (27.03.2007 в 15:58)   письмо автору
 
   для: Trianon   (27.03.2007 в 15:19)
 

нет, это не подойдет.
Нужно до INSERT проверить данные.

   
 
 автор: Trianon   (27.03.2007 в 15:19)   письмо автору
 
   для: LO   (27.03.2007 в 14:54)
 

Вероятно, нужно просто удалить строку из таблицы new.

   
 
 автор: LO   (27.03.2007 в 14:54)   письмо автору
 
   для: cheops   (27.03.2007 в 14:24)
 

да, я исправила, триггер создался, но вот дело в том, что мне нужно именно не выполнить INSERT если выполнится условие. А как это сделать?
Как вызвать в триггерах сообщение об ошибке или что-то в этом роде?

   
 
 автор: cheops   (27.03.2007 в 14:24)   письмо автору
 
   для: LO   (27.03.2007 в 13:49)
 

У вас нет точки с запятой после оператора SELECT.

   
 
 автор: Trianon   (27.03.2007 в 14:00)   письмо автору
 
   для: LO   (27.03.2007 в 13:47)
 

таблица естественным образом раскладывается на
items(id, abbrev NULL)
и
attributes(id, item_id)

ну или если NULL и не NULL обязаны сосуществовать независимо, то
attributes(id, item_id, is_abbreviated)

   
 
 автор: LO   (27.03.2007 в 13:49)   письмо автору
 
   для: cheops   (27.03.2007 в 13:26)
 

я не могу его создать
Где-то ошибка ,но я не знаю где именно, ругается на строчку с SELECT

   

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

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

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