SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 09.12.2010 15:32:51

Twix
Завсегдатай
Зарегистрирован: 21.02.2008
Сообщений: 88

Триггеры

Уважаемые коллеги, возникли проблемы с написанием кода . Имеем базу данных с двумя таблицами, организована загрузка данных в таблицы посредством команды LOAD DATA  INFILE. Требуется рассортировать данные по этим двум таблицам, оценивая значение одного из столбцов файла из которого происходит загрузка данных.
MySQL version 5.0.51? OC Win XP SP2

--
--
-- Create schema quality
--

CREATE DATABASE  quality ;
USE quality;


--
-- Definition of table `214`
--

CREATE TABLE `214`(
`id` int(10) unsigned NOT NULL  auto_increment,
`Data` date NOT NULL ,
`mode` tinyint(2) unsigned NOT NULL,
`brak` smallint(3) unsigned NOT NULL,
`Lok` varchar(4) NOT NULL,
`initiator` varchar(2)  default ' ',
`str` varchar(3)   default ' ' ,
PRIMARY KEY(`id`,`Data`,`mode`)
)ENGINE=InnoDB  AUTO_INCREMENT=325014140;


--
-- Definition of table `214_73`
--


CREATE TABLE `214_73`(
`id` int(10) unsigned NOT NULL  auto_increment,
`Data` date NOT NULL ,
`mode` tinyint(2) unsigned NOT NULL,
`Brak` smallint(3) unsigned NOT NULL,
`Lok` varchar(4) NOT NULL,
`initiator` varchar(2)  default ' ',
`str` varchar(3)   default ' ' ,
PRIMARY KEY(`id`,`Data`,`mode`)
)ENGINE=InnoDB  AUTO_INCREMENT=325014140;




--
-- Definition of trigger `modification_214`
--

DROP TRIGGER /*!50030 IF EXISTS */ `modification_214`;

DELIMITER $$

CREATE DEFINER = `root`@`localhost` TRIGGER `modification_214` BEFORE INSERT ON `214` FOR EACH ROW begin

    declare barid int default 0;
    declare ts date default curdate();
    declare _md int default 0;

    select max(id) into barid;
    Select curdate() into ts;
    set _md = 2;

if new.mode = _md then

insert into 214_73 (id,Data, mode, Brak, Lok, initiator, str) VALUES(barid, ts, new.mode, new.brak, new.Lok, new.initiator, new.str);
else insert into 214 (id,Data, mode, Brak, Lok, initiator, str) VALUES(barid, ts, new.mode, new.brak, new.Lok, new.initiator, new.str);

    end if;

end $$

DELIMITER ;







 


Что то в триггере не так, постоянно выскакивает ошибка :Error while executing this query:CREATE DEFINER = `root`@`localhost` TRIGGER `modification_214` BEFORE INSERT ON `214` FOR EACH ROW begin

    declare barid int default 0;
    declare ts date default curdate();
    declare _md int default 0;

    select max(id) into barid;
    Select curdate() into ts;
    set _md = 2;

if new.mode = _md then

insert into 214_73 (id,Data, mode, Brak, Lok, initiator, str) VALUES(barid, ts, new.mode, new.brak, new.Lok, new.initiator, new.str);
else insert into 214 (id,Data, mode, Brak, Lok, initiator, str) VALUES(barid, ts, new.mode, new.brak, new.Lok, new.initiator, new.str);

    end if;

end $$
The server has returned this error message:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '214 (id,Data, mode, Brak, Lok, initiator, str) VALUES(barid, ts, new.mode, new.b' at line 14

Неактивен

 

#2 09.12.2010 15:41:49

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5831

Re: Триггеры

Имя таблицы не может быть только из цифр. Точнее может, но в этом случае его нужно взять в обратные кавычки.

Неактивен

 

#3 09.12.2010 22:27:15

Twix
Завсегдатай
Зарегистрирован: 21.02.2008
Сообщений: 88

Re: Триггеры

За ответ спасибо, всё откомпилировалось на ура. Только вот при попытке вставить данные в таблицу получаем сообщение об ошибке ???

mysql> --
mysql> -- Create schema quality
mysql> --
mysql>
mysql> CREATE DATABASE  quality ;
Query OK, 1 row affected (0.01 sec)

mysql> USE quality;
Database changed
mysql>
mysql>
mysql> --
mysql> -- Definition of table `tb_214`
mysql> --
mysql>
mysql> CREATE TABLE `tb_214`(
    -> `id` int(10) unsigned   auto_increment,
    -> `Date` date NOT NULL ,
    -> `mode` tinyint(2) unsigned NOT NULL,
    -> `brak` smallint(3) unsigned NOT NULL,
    -> `Lok` varchar(4) NOT NULL,
    -> `initiator` varchar(2)  default ' ',
    -> `str` varchar(3)   default ' ' ,
    -> PRIMARY KEY(`id`,`Date`,`mode`)
    -> )ENGINE=InnoDB  AUTO_INCREMENT=325014140;
Query OK, 0 rows affected (0.17 sec)

mysql>
mysql>
mysql> --
mysql> -- Definition of table `tb_214_73`
mysql> --
mysql>
mysql>
mysql> CREATE TABLE `tb_214_73`(
    -> `id` int(10) unsigned   auto_increment,
    -> `Date` date NOT NULL ,
    -> `mode` tinyint(2) unsigned NOT NULL,
    -> `Brak` smallint(3) unsigned NOT NULL,
    -> `Lok` varchar(4) NOT NULL,
    -> `initiator` varchar(2)  default ' ',
    -> `str` varchar(3)   default ' ' ,
    -> PRIMARY KEY(`id`,`Date`,`mode`)
    -> )ENGINE=InnoDB  AUTO_INCREMENT=325014140;
Query OK, 0 rows affected (0.13 sec)

mysql>
mysql>
mysql>
mysql>
mysql> --
mysql> -- Definition of trigger `modification_214`
mysql> --
mysql>
mysql> DROP TRIGGER /*!50030 IF EXISTS */ `modification_214`;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql>
mysql> DELIMITER $$
mysql>
mysql> CREATE DEFINER = `root`@`localhost` TRIGGER `modification_214` BEFORE INSERT ON tb_214 FOR EACH ROW begin
    ->
    ->     declare barid int default 0;
    ->     declare ts date default curdate();
    ->     declare _md int default 0;
    ->
    ->     select max(id) into barid;
    ->     Select curdate() into ts;
    ->     set _md = 2;
    ->
    -> if new.mode = _md then
    ->
    -> insert into tb_214_73(id,Date, mode, Brak, Lok, initiator, str)VALUES(barid, ts, new.mode, new.brak, new.Lok, new.initiator, new.str);
    -> else insert into tb_214(id,Date, mode, Brak, Lok, initiator, str)VALUES(barid, ts, new.mode, new.brak, new.Lok, new.initiator, new.str);
    ->
    ->     end if;
    ->
    -> end $$
Query OK, 0 rows affected (0.06 sec)

mysql>
mysql> DELIMITER ;
mysql>
mysql>
mysql> insert into tb_214 VALUES(null, curdate(), 2,751,'4T5', 'R','6');
ERROR 1054 (42S22): Unknown column 'id' in 'field list'     /*????????????????????????????????????????????*/
mysql>  insert into tb_214_73 VALUES(null, curdate(), 2,751,'4T5', 'R','6');
Query OK, 1 row affected (0.08 sec)

mysql> insert into tb_214 VALUES(null, curdate(), 2,751,'4T5', 'R','6');
ERROR 1054 (42S22): Unknown column 'id' in 'field list'
mysql> insert into tb_214_73 VALUES(null, curdate(), 2,751,'4T5', 'R','6');
Query OK, 1 row affected (0.05 sec)

mysql> SELECT*FROM `tb_214`;
Empty set (0.00 sec)

mysql> select*from `tb_214_73`;
+-----------+------------+------+------+-----+-----------+------+
| id        | Date       | mode | Brak | Lok | initiator | str  |
+-----------+------------+------+------+-----+-----------+------+
| 325014140 | 2010-12-09 |    2 |  751 | 4T5 | R         | 6    |
| 325014141 | 2010-12-09 |    2 |  751 | 4T5 | R         | 6    |
+-----------+------------+------+------+-----+-----------+------+
2 rows in set (0.01 sec)

mysql> insert into tb_214 VALUES(null, curdate(), 4,751,'4T5', 'R','6');
ERROR 1054 (42S22): Unknown column 'id' in 'field list'   /* ???????????????????????????????????????????*/
mysql> insert into tb_214_73 VALUES(null, curdate(), 4,751,'4T5', 'R','6');
Query OK, 1 row affected (0.03 sec)

mysql> select*from `tb_214_73`;
+-----------+------------+------+------+-----+-----------+------+
| id        | Date       | mode | Brak | Lok | initiator | str  |
+-----------+------------+------+------+-----+-----------+------+
| 325014140 | 2010-12-09 |    2 |  751 | 4T5 | R         | 6    |
| 325014141 | 2010-12-09 |    2 |  751 | 4T5 | R         | 6    |
| 325014142 | 2010-12-09 |    4 |  751 | 4T5 | R         | 6    |
+-----------+------------+------+------+-----+-----------+------+
3 rows in set (0.00 sec)

mysql>

Неактивен

 

#4 10.12.2010 00:02:05

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Триггеры

select max(id) into barid; -- вот эта строка странная.

Неактивен

 

#5 10.12.2010 00:24:44

Twix
Завсегдатай
Зарегистрирован: 21.02.2008
Сообщений: 88

Re: Триггеры

Спасибо !!!

Неактивен

 

#6 11.12.2010 00:59:47

Twix
Завсегдатай
Зарегистрирован: 21.02.2008
Сообщений: 88

Re: Триггеры

С этим вопрос решили, но появился следующий . Каким образом очистить таблицу `tb_214_all` после произведённой рассортировки данных по другим таблицам. В общем можно прописать новые триггеры привязанные к таблицам `tb_214` , `tb_214_73` , `tb_011` и после операции вставки данных производить удаление данных из tb_214_all` , но прийдётся писать три триггера и как то это всё коряво выглядит, хотелось бы что то по элегантнее.

--
-- Create schema quality
--

CREATE DATABASE  quality ;
USE quality;

--
-- Definition of table `tb_214_all`
--

CREATE  TABLE `tb_214_all`(
`id` int(10) unsigned   auto_increment,
`Date` date NOT NULL ,
`mode` tinyint(2) unsigned NOT NULL,
`brak` smallint(3) unsigned NOT NULL,
`Lok` varchar(4) NOT NULL,
`initiator` varchar(2)  default ' ',
`str` varchar(3)   default ' ' ,
PRIMARY KEY(`id`,`Date`,`mode`)
)ENGINE=InnoDB  AUTO_INCREMENT=1;


--
-- Definition of table `tb_214`
--

CREATE TABLE `tb_214`(
`id` int(10) unsigned   auto_increment,
`Date` date NOT NULL ,
`mode` tinyint(2) unsigned NOT NULL,
`brak` smallint(3) unsigned NOT NULL,
`Lok` varchar(4) NOT NULL,
`initiator` varchar(2)  default ' ',
`str` varchar(3)   default ' ' ,
PRIMARY KEY(`id`,`Date`,`mode`)
)ENGINE=InnoDB  AUTO_INCREMENT=1;


--
-- Definition of table `tb_214_73`
--


CREATE TABLE `tb_214_73`(
`id` int(10) unsigned   auto_increment,
`Date` date NOT NULL ,
`mode` tinyint(2) unsigned NOT NULL,
`Brak` smallint(3) unsigned NOT NULL,
`Lok` varchar(4) NOT NULL,
`initiator` varchar(2)  default ' ',
`str` varchar(3)   default ' ' ,
PRIMARY KEY(`id`,`Date`,`mode`)
)ENGINE=InnoDB  AUTO_INCREMENT=1;


--
-- Definition of table `tb_011`
--

CREATE TABLE `tb_011`(
`id` int(10) unsigned   auto_increment,
`Date` date NOT NULL ,
`mode` tinyint(2) unsigned NOT NULL,
`brak` smallint(3) unsigned NOT NULL,
`Lok` varchar(4) NOT NULL,
`initiator` varchar(2)  default ' ',
`str` varchar(3)   default ' ' ,
PRIMARY KEY(`id`,`Date`,`mode`)
)ENGINE=InnoDB  AUTO_INCREMENT=1;


--
-- Definition of trigger `modification_214`
--

DROP TRIGGER /*!50030 IF EXISTS */ `modification_214`;

DELIMITER $$

CREATE DEFINER = `root`@`localhost` TRIGGER `modification_214` BEFORE INSERT ON tb_214_all FOR EACH ROW begin

    declare barid int default 0;
    declare ts date default curdate();
    declare _md int default 0;
    declare _m11 int default 0;

 
    Select curdate() into ts;
    set _md = 2;
    set _m11 = 69;

if STRCMP(new.mode , _md )=0 then

     insert into tb_214_73(id,Date, mode, Brak, Lok, initiator, str)VALUES(null, ts, new.mode, new.brak, new.Lok, new.initiator, new.str);

 else

if STRCMP(new.mode , _m11 )=0 then

     insert into tb_011(id,Date, mode, Brak, Lok, initiator, str)VALUES(null, ts, new.mode, new.brak, new.Lok, new.initiator, new.str);

 else

     insert into tb_214(id,Date, mode, Brak, Lok, initiator, str)VALUES(null, ts, new.mode, new.brak, new.Lok, new.initiator, new.str);

 end if;

 end if;


end $$

DELIMITER ;


 

Неактивен

 

#7 12.12.2010 12:59:54

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Триггеры

Если Вас смущает копирование кода, то можете сделать хранимую процедуру,
которую уже вызывать из триггеров.

Неактивен

 

#8 13.12.2010 21:37:48

Twix
Завсегдатай
Зарегистрирован: 21.02.2008
Сообщений: 88

Re: Триггеры

Хм. Перёвёл названеи столбцов на русский и вновь траблы... мля.
В коде два однотипных по логике триггера и один и тот же постоянно не работает( компиляция не заканчивается привычным "mysql>", а заканчивается "`> "). и далее при обработке запросов триггер не работает.

--
-- Create schema quality
--

CREATE DATABASE  quality DEFAULT CHARACTER SET cp1251;
USE quality;

--
-- Definition of table `tb_183`
--


CREATE TABLE `tb_183`(
`id` int(10) unsigned NOT NULL  auto_increment,
`Дата` date NOT NULL ,
`Кокиль` tinyint(2) unsigned NOT NULL,
`Дефект` smallint(3) unsigned NOT NULL,
`Локация` varchar(4) NOT NULL,
`Автор` varchar(3)  default ' ',
`Стержень` varchar(3)   default ' ' ,
PRIMARY KEY(`id`,`Дата`,`Кокиль`,`Дефект`)

)ENGINE=InnoDB  AUTO_INCREMENT=1;


--
-- Definition of table `temp_214`
--

CREATE TABLE `temp_214`(
`id` int(10) unsigned NOT NULL  auto_increment,
`Дата` date NOT NULL ,
`Кокиль` tinyint(2) unsigned NOT NULL,
`Дефект` smallint(3) unsigned NOT NULL,
`Локация` varchar(4) NOT NULL,
`Автор` varchar(3)  default ' ',
`Стержень` varchar(3)   default ' ' ,
PRIMARY KEY(`id`,`Дата`,`Кокиль`,`Дефект`)
)ENGINE=InnoDB  AUTO_INCREMENT=1;

--
-- Definition of table `tb_214`
--

CREATE TABLE `tb_214`(
`id` int(10) unsigned NOT NULL  auto_increment,
`Дата` date NOT NULL ,
`Кокиль` tinyint(2) unsigned NOT NULL,
`Дефект` smallint(3) unsigned NOT NULL,
`Локация` varchar(4) NOT NULL,
`Автор` varchar(3)  default ' ',
`Стержень` varchar(3)   default ' ' ,
PRIMARY KEY(`id`,`Дата`,`Кокиль`,`Дефект`)
)ENGINE=InnoDB  AUTO_INCREMENT=1;

--
-- Definition of table `tb_214_73`
--


CREATE TABLE `tb_214_73`(
`id` int(10) unsigned NOT NULL  auto_increment,
`Дата` date NOT NULL ,
`Кокиль` tinyint(2) unsigned NOT NULL,
`Дефект` smallint(3) unsigned NOT NULL,
`Локация` varchar(4) NOT NULL,
`Автор` varchar(3)  default ' ',
`Стержень` varchar(3)   default ' ' ,
PRIMARY KEY(`id`,`Дата`,`Кокиль`,`Дефект`)
)ENGINE=InnoDB  AUTO_INCREMENT=1;


--
-- Definition of table `tb_011`
--

CREATE TABLE `tb_011`(
`id` int(10) unsigned NOT NULL  auto_increment,
`Дата` date NOT NULL ,
`Кокиль` tinyint(2) unsigned NOT NULL,
`Дефект` smallint(3) unsigned NOT NULL,
`Локация` varchar(4) NOT NULL,
`Автор` varchar(3)  default ' ',
`Стержень` varchar(3)   default ' ' ,
PRIMARY KEY(`id`,`Дата`,`Кокиль`,`Дефект`)
)ENGINE=InnoDB  AUTO_INCREMENT=1;


--
-- Definition of trigger `modification_214`    **************************************/* проблемный код*/
--


DELIMITER $$

CREATE DEFINER = `root`@`localhost` TRIGGER `modification_214` BEFORE INSERT ON temp_214 FOR EACH ROW begin

    declare barid int default 0;
    declare ts date default curdate();
    declare _md2 int default 0;
    declare _md3 int default 0;
    declare _md9 int default 0;
    declare _md18 int default 0;
    declare _md20 int default 0;
    declare _md21 int default 0;
    declare _md22 int default 0;
    declare _md29 int default 0;
    declare _m69 int default 0;
    declare _m81 int default 0;
 
    Select curdate() into ts;

    set _md2 =2;
    set _md3 =3;
    set _md9 =9;
    set _md18 =18;
    set _md20 =20;
    set _md21 =21;
    set _md22 =22;
    set _md29 =29;
    set _m69 =69;
    set _m81 =81;

if (new.`Кокиль` = _md2 )||(new.`Кокиль` = _md3 )||(new.`Кокиль` = _md9 )||(new.`Кокиль` = _md18 )||(new.`Кокиль` = _md20 )||(new.`Кокиль` = _md21 )||(new.`Кокиль` = _md22 )||(new.`Кокиль` = _md29 ) then

     insert into tb_214_73(id,`Дата`, `Кокиль`, `Дефект`, `Локация`, `Автор`, `Стержень`)VALUES(null, curdate(), new.`Кокиль`, new.`Дефект, new.`Локация`, new.`Автор`, new.`Стержень`);
   
   else

if (new.`Кокиль` = _m69 )||(new.`Кокиль` = _m81 ) then

     insert into tb_011(id,`Дата`, `Кокиль`, `Дефект`, `Локация`, `Автор`, `Стержень`)VALUES(null, curdate(), new.`Кокиль`, new.`Дефект`, new.`Локация`, new.`Автор`, new.`Стержень`);
     
   else

     insert into tb_214(id,`Дата`, `Кокиль`, `Дефект`, `Локация`, `Автор`, `Стержень`)VALUES(null, curdate(), new.`Кокиль`, new.`Дефект`, new.`Локация`, new.`Автор`, new.`Стержень`);
   
 end if;

 end if;


end $$

DELIMITER ;


--
-- Definition of table `temp_126`
--


CREATE TABLE `temp_126`(
`id` int(10) unsigned NOT NULL  auto_increment,
`Дата` date NOT NULL ,
`Кокиль` tinyint(2) unsigned NOT NULL,
`Дефект` smallint(3) unsigned NOT NULL,
`Локация` varchar(4) NOT NULL,
`Автор` varchar(3)  default ' ',
`Стержень` varchar(3)   default ' ' ,
PRIMARY KEY(`id`,`Дата`,`Кокиль`,`Дефект`)
)ENGINE=InnoDB  AUTO_INCREMENT=1;


--
-- Definition of table `tb_126`
--


CREATE TABLE `tb_126`(
`id` int(10) unsigned NOT NULL  auto_increment,
`Дата` date NOT NULL ,
`Кокиль` tinyint(2) unsigned NOT NULL,
`Дефект` smallint(3) unsigned NOT NULL,
`Локация` varchar(4) NOT NULL,
`Автор` varchar(3)  default ' ',
`Стержень` varchar(3)   default ' ' ,
PRIMARY KEY(`id`,`Дата`,`Кокиль`,`Дефект`)
)ENGINE=InnoDB  AUTO_INCREMENT=1;


--
-- Definition of table `tb_194`
--


CREATE TABLE `tb_194`(
`id` int(10) unsigned NOT NULL  auto_increment,
`Дата` date NOT NULL ,
`Кокиль` tinyint(2) unsigned NOT NULL,
`Дефект` smallint(3) unsigned NOT NULL,
`Локация` varchar(4) NOT NULL,
`Автор` varchar(3)  default ' ',
`Стержень` varchar(3)   default ' ' ,
PRIMARY KEY(`id`,`Дата`,`Кокиль`,`Дефект`)
)ENGINE=InnoDB  AUTO_INCREMENT=1;






--
-- Definition of trigger `modification_126`
--



DELIMITER $$

CREATE DEFINER = `root`@`localhost` TRIGGER `modification_126` BEFORE INSERT ON temp_126 FOR EACH ROW begin

    declare barid int default 0;
    declare ts date default curdate();
    declare _md9 int default 0;
    declare _md15 int default 0;
    declare _md16 int default 0;
    declare _md17 int default 0;
   
 
    Select curdate() into ts;

    set _md9 =9;
    set _md15 =15;
    set _md16 =16;
    set _md17 =17;
   

if (new.`Кокиль` = _md9 )||(new.`Кокиль` = _md15 )||(new.`Кокиль` = _md16 )||(new.`Кокиль` = _md17 ) then

     insert into tb_194(id,`Дата`, `Кокиль`, `Дефект`, `Локация`, `Автор`, `Стержень`)VALUES(null, curdate(), new.`Кокиль`, new.`Дефект`, new.`Локация`, new.`Автор`, new.`Стержень`);
     
 else

insert into tb_126(id,`Дата`, `Кокиль`, `Дефект`, `Локация`, `Автор`, `Стержень`)VALUES(null, curdate(), new.`Кокиль`, new.`Дефект`, new.`Локация`, new.`Автор`, new.`Стержень`);
     
 

 end if;


end $$

DELIMITER ;


 

Неактивен

 

#9 14.12.2010 01:01:49

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Триггеры

Это всё невнимательность. MySQL даже подсказывает Вам, в чём ошибка wink

Найдите ее в этой строке:

Код:

insert into tb_214_73(id,`Дата`, `Кокиль`, `Дефект`, `Локация`, `Автор`, `Стержень`)VALUES(null, curdate(), new.`Кокиль`, new.`Дефект, new.`Локация`, new.`Автор`, new.`Стержень`);

Неактивен

 

#10 14.12.2010 20:00:32

Twix
Завсегдатай
Зарегистрирован: 21.02.2008
Сообщений: 88

Re: Триггеры

Да , как то даже стыдно по таким пустяковым ошибкам беспокоить уважаемых людей. Извиняюсь. Спасибо.sad и sad

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson