Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Trigger MYSQL
Форумы портала PHP.SU » » Вопросы новичков » Trigger MYSQL

Страниц (1): [1]
 

1. ytrewq123 - 16 Сентября, 2017 - 00:52:59 - перейти к сообщению
Здравствуйте!
Вот такой вопросик.
Смотрю Триггеры в Мysql
Ну вроде всё понятно. Но…
Создал.

MariaDB [baza_1]> CREATE TRIGGER kuku BEFORE INSERT ON tabla
-> FOR EACH ROW
-> BEGIN
-> INSERT INTO vivik VALUES('NUUUUU');
-> END;
-> |
Query OK, 0 rows affected (0.11 sec)

Создал Вивик.
MariaDB [baza_1]> CREATE VIEW vivik AS SELECT nombre FROM tabla;
Query OK, 0 rows affected (0.05 sec)
Пытаюсь совершить добавление
MariaDB [baza_1]> INSERT INTO tabla (nombre, teksto, ko, datos) VALUES('qqq','aa
a','zzz','xxx');
И!!! Вот такое.
ERROR 1442 (HY000): Can't update table 'tabla' in stored function/trigger becaus
e it is already used by statement which invoked this stored function/trigger.
Никак не понимаю почему и что делать.
Не подскажите в чём проблема?
Почему Триггер не позволяет добавление?
2. LIME - 16 Сентября, 2017 - 01:30:51 - перейти к сообщению
потому что в мускуле вьюхи это не таблицы а только результат запросов
они не индексируются
они всеголишь результат запроса
со всеми вытекающими
короче- вьюха это не таблица - это результат запроса
и соответственно триггеры тоже не але
---
лично я предпочитаю не юзать триггеры и всяческие хранимки если не нада очень сильно
предпочитаю не зависеть лишний раз от хранилища
---
в этом есть плюсы и минусы
плюсы в относительно легкой смене хранилища
минусы в потере контроля над консистентностью данных которые проще решать на уровне бд
транзакции шманзакции
---
по сабжу
вьюха это не таблица
3. ytrewq123 - 16 Сентября, 2017 - 11:01:33 - перейти к сообщению
Спасибо Вам.
Я просто как бы учусь, ибо в одном объявлении на работу, очень акцентировали на этом внимание. Поэтому решил углубится.
Спасибо ещё раз.
4. Мелкий - 16 Сентября, 2017 - 11:35:17 - перейти к сообщению
LIME пишет:
потому что в мускуле вьюхи это не таблицы а только результат запросов

view - это сам запрос, а не его результат. Результат запроса не хранится и даже не факт, что именно этот запрос будет выполняться. Чтение из view может интересным образом переписывать запрос скрытый во вьюхе. Выкидывать ненужные джойны, пробрасывать вовнутрь условия из внешнего запроса (правда, я плохо помню, что из этого умеет mysql с форками)

Результат запроса - это Materialized View, mysql их не умеет.
Можно ли сделать insert в view - вопрос более интересный. Иногда можно: http://sqlfiddle[dot]com/#!9/d856f/1
(хм. а я удивился, в mysql запрещено во вьюху утрамбовать подзапрос from table join (select ... ) sq)

К ошибке
Цитата:
ERROR 1442 (HY000): Can't update table 'tabla' in stored function/trigger becaus
e it is already used by statement which invoked this stored function/trigger.

приводит как раз то, что ваша view простая и mysql может преобразовать insert запрос к ней в insert запрос к вышестоящей таблице.
И что получается?
Top-level запрос делает insert в tabla, срабатывает on insert триггер, делает insert во вьюшку, который переписывается в insert в tabla, дальше должен сработать on insert триггер и так далее без условия выхода.
Разработчики mysql не стали задумываться над этими материями и просто запретили из триггеров проводить любые пишущие манипуляции с таблицами, которые уже вызвали триггеры.
При чём тут хранимки - наверное у них тот же запрет действует. Но хранимки в mysql вещь такая удивительная... Используйте или mysql или хранимки но не оба сразу.

А вот если в триггере попробуете писать куда-нибудь в другое место - то всё получится.
5. LIME - 16 Сентября, 2017 - 15:47:09 - перейти к сообщению
Мелкий спасибо за инфу
но я для себя уже решил
мухи отдельно
котлеты отдельно
логика в коде
данные в бд
и толко оооочень редко если необходимо поддержать консистентность данных на уровне бд я соглашусь с логикой на стороне бд
имею мнение хрен оспоришь)

 

Powered by ExBB FM 1.0 RC1