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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Trigger MYSQL

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
ytrewq123
Отправлено: 16 Сентября, 2017 - 00:52:59
Post Id


Посетитель


Покинул форум
Сообщений всего: 352
Дата рег-ции: Окт. 2014  


Помог: 0 раз(а)




Здравствуйте!
Вот такой вопросик.
Смотрю Триггеры в М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.
Никак не понимаю почему и что делать.
Не подскажите в чём проблема?
Почему Триггер не позволяет добавление?
 
 Top
LIME
Отправлено: 16 Сентября, 2017 - 01:30:51
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




потому что в мускуле вьюхи это не таблицы а только результат запросов
они не индексируются
они всеголишь результат запроса
со всеми вытекающими
короче- вьюха это не таблица - это результат запроса
и соответственно триггеры тоже не але
---
лично я предпочитаю не юзать триггеры и всяческие хранимки если не нада очень сильно
предпочитаю не зависеть лишний раз от хранилища
---
в этом есть плюсы и минусы
плюсы в относительно легкой смене хранилища
минусы в потере контроля над консистентностью данных которые проще решать на уровне бд
транзакции шманзакции
---
по сабжу
вьюха это не таблица
 
 Top
ytrewq123
Отправлено: 16 Сентября, 2017 - 11:01:33
Post Id


Посетитель


Покинул форум
Сообщений всего: 352
Дата рег-ции: Окт. 2014  


Помог: 0 раз(а)




Спасибо Вам.
Я просто как бы учусь, ибо в одном объявлении на работу, очень акцентировали на этом внимание. Поэтому решил углубится.
Спасибо ещё раз.
 
 Top
Мелкий Супермодератор
Отправлено: 16 Сентября, 2017 - 11:35:17
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




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 или хранимки но не оба сразу.

А вот если в триггере попробуете писать куда-нибудь в другое место - то всё получится.


-----
PostgreSQL DBA
 
 Top
LIME
Отправлено: 16 Сентября, 2017 - 15:47:09
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




Мелкий спасибо за инфу
но я для себя уже решил
мухи отдельно
котлеты отдельно
логика в коде
данные в бд
и толко оооочень редко если необходимо поддержать консистентность данных на уровне бд я соглашусь с логикой на стороне бд
имею мнение хрен оспоришь)
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB