Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / update через суммирование из разных таблиц / 23 сообщений из 23, страница 1 из 1
30.04.2014, 00:56:31
    #38629572
manfredima
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update через суммирование из разных таблиц
Подскажите, плиз, как записать слагаемые триггера, который обновляет строку таблица2 по событию в таблица1 ?
Как правильно указать выделенное жирным?

CREATE TRIGGER имятриггера AFTER INSERT ON таблица1
UPDATE таблица2 SET поле = TIME_TO_SEC ( таблица1.поле ) + TIME_TO_SEC ( таблица2.поле )
...
Рейтинг: 0 / 0
30.04.2014, 01:18:16
    #38629583
manfredima
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update через суммирование из разных таблиц
Или же, может, имеет смысл таблица1.поле добавить в таблица2 и только потом складывать как поля одной таблицы?
...
Рейтинг: 0 / 0
30.04.2014, 05:02:39
    #38629622
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update через суммирование из разных таблиц
manfredima,

во-первых, к обновляемым полям в триггере можно(нужно) обращаться через псевдо-псевдонимы :) new/old
во-вторых, вы хотите обновить всю Т2 или только какую-то одну запись, связанную с обновляемой записью в Т1? из запроса получается, что всю, но это необычно, поэтому уточните, действительно ли вы этого хотите.
...
Рейтинг: 0 / 0
30.04.2014, 10:12:34
    #38629792
manfredima
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update через суммирование из разных таблиц
1. я читал про поля new/old, но сам понял, что таковыми нарекаются поля отслеживаемой таблицы (типа - предыдущее последнее и новое последнее ). А выходит - поля изменяемой :)

2. запись UPDATE таблица2 SET поле вроде бы даёт понять, что должно обновиться поле . В T2 - два поля и одна строка.
...
Рейтинг: 0 / 0
30.04.2014, 10:56:17
    #38629876
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update через суммирование из разных таблиц
manfredimaя читал про поля new/old, но сам понял, что таковыми нарекаются поля отслеживаемой таблицы (типа - предыдущее последнее и новое последнее ). А выходит - поля изменяемой :)это поля той таблицы, изменения в которой вызывают триггер
как проще объяснить, я не знаю :)

manfredimaзапись UPDATE таблица2 SET поле вроде бы даёт понять, что должно обновиться поле . В T2 - два поля и одна строка.одно поле, но во всех строках
но если у вас всего одна строка в таблице, то разницы нет
...
Рейтинг: 0 / 0
30.04.2014, 11:25:01
    #38629906
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update через суммирование из разных таблиц
manfredimaПодскажите, плиз, как записать слагаемые триггера, который обновляет строку таблица2 по событию в таблица1 ?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TRIGGER `имятриггера` 
AFTER INSERT 
ON `таблица1` 
FOR EACH ROW
BEGIN
  UPDATE `таблица2` 
  SET `поле` = `таблица2`.`поле` + TIME_TO_SEC (NEW.поле)
  WHERE `таблица2`.`ключ` = NEW.`ключ`;
END;
...
Рейтинг: 0 / 0
30.04.2014, 14:43:08
    #38630192
manfredima
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update через суммирование из разных таблиц
tanglirэто поля той таблицы, изменения в которой вызывают триггер.я так и думал изначально, но вы неопределённо написали: " к обновляемым полям в триггере можно(нужно) обращаться через псевдо-псевдонимы :) new/old "

Ведь "обновляемые поля" - фраза не особо конкретная: обновляемые ЧЕМ - триггером или действием пользователя?
Теперь я точно знаю - что обновляемые юзером :)
...
Рейтинг: 0 / 0
30.04.2014, 14:50:10
    #38630209
manfredima
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update через суммирование из разных таблиц
мне немного непонятно место кода (жирным):

SET `поле` = `таблица2`.`поле` + TIME_TO_SEC (NEW.поле)
WHERE `таблица2`.`ключ` = NEW.`ключ`;


- обозначает ли запись NEW.поле - поле из T1, из новодобавленной юзером строки?
- что такое NEW.ключ ?
...
Рейтинг: 0 / 0
30.04.2014, 15:11:46
    #38630251
manfredima
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update через суммирование из разных таблиц
я немного упростил (для себя) схему и теперь сюжет таков:

1. есть таблица jos_k2_items с полем extra_fields

2. есть таблица jos_k2_totaltime :

id totaltime plustime1 651:31:25 00:00:00
3. при добавлении новой строки в jos_k2_items триггер должен :
- значением из jos_k2_items.extra_fields обновить поле jos_k2_totaltime.plustime
- обновить jos_k2_totaltime.totaltime = jos_k2_totaltime.totaltime + jos_k2_totaltime.plustime

Код: plsql
1.
2.
3.
4.
5.
6.
CREATE TRIGGER update_totaltime AFTER INSERT ON jos_k2_items
FOR EACH ROW
 BEGIN
  UPDATE jos_k2_totaltime SET plustime = SUBSTRING('NEW.extra_fields' FROM (POSITION('"id":"10"' IN 'NEW.extra_fields') + 18) FOR 8); 
  UPDATE jos_k2_totaltime SET totaltime = SEC_TO_TIME(TIME_TO_SEC(plustime) + TIME_TO_SEC(totaltime)) WHERE id=1;
 END



Код с SUBSTRING и POSITION осмысливать не надо: я так получаю нужные данные и он работает.
Меня интересуют записи самих полей NEW.extra_fields - верно ли?
...
Рейтинг: 0 / 0
30.04.2014, 15:24:04
    #38630269
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update через суммирование из разных таблиц
manfredima,

https://dev.mysql.com/doc/refman/5.0/en/create-trigger.html Within the trigger body, you can refer to columns in the subject table (the table associated with the trigger) by using the aliases OLD and NEW. OLD.col_name refers to a column of an existing row before it is updated or deleted. NEW.col_name refers to the column of a new row to be inserted or an existing row after it is updated.

Если вы пытаетесь с помощью
manfredima
Код: plsql
1.
SUBSTRING('NEW.extra_fields' FROM ...

заставить триггер искать по всем полям исходной таблицы, то ничего у вас не получится. Кстати, поэтому я не верю, что
manfredimaКод с SUBSTRING и POSITION осмысливать не надо: я так получаю нужные данные и он работает .
Вот если бы кавычек не было, то это бы выглядело нормально.
...
Рейтинг: 0 / 0
30.04.2014, 15:34:05
    #38630290
manfredima
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update через суммирование из разных таблиц
я имел ввиду, что код работал до того , как я вставил его в триггер и ввел NEW.поля
сейчас-то он, как раз, не работает с указанием ошибки в 4 строке, а в чем ошибка - я не понимаю, потому что и без кавычек выдаёт ошибку.
...
Рейтинг: 0 / 0
30.04.2014, 15:36:57
    #38630296
manfredima
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update через суммирование из разных таблиц
tanglirЕсли вы пытаетесь с помощью
manfredima
Код: plsql
1.
SUBSTRING('NEW.extra_fields' FROM ...

заставить триггер искать по всем полям исходной таблицы, то ничего у вас не получится. почему - по всем? Разве NEW.extra_fields не обозначает конкретное поле в колонке extra_fields из управляющей таблицы?
...
Рейтинг: 0 / 0
30.04.2014, 15:41:03
    #38630307
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update через суммирование из разных таблиц
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TRIGGER update_totaltime AFTER INSERT ON jos_k2_items
FOR EACH ROW
BEGIN
  UPDATE jos_k2_totaltime SET 
    plustime  = SUBSTRING(NEW.extra_fields FROM (POSITION('id:10' IN NEW.extra_fields) + 18) FOR 8), 
    totaltime = SEC_TO_TIME(TIME_TO_SEC(plustime) + TIME_TO_SEC(totaltime)) 
  -- если в JOS_K2_TOTALTIME всего 1 строка, то WHERE - не надо, 
  -- иначе нужно как-то выбрать одну обновляемую строку, например, так:
  WHERE id=NEW.id; 
END
...
Рейтинг: 0 / 0
30.04.2014, 15:48:03
    #38630320
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update через суммирование из разных таблиц
manfredimaРазве NEW.extra_fields не обозначает конкретное поле в колонке extra_fields из управляющей таблицы?NEW.extra_fields - да
'NEW.extra_fields' - нет
...
Рейтинг: 0 / 0
30.04.2014, 16:09:04
    #38630350
manfredima
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update через суммирование из разных таблиц
строка "id":"10" именно такая изначально, я не могу убрать двойные кавычки
...
Рейтинг: 0 / 0
30.04.2014, 16:40:30
    #38630402
manfredima
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update через суммирование из разных таблиц
на этот код

Код: plsql
1.
2.
3.
4.
5.
6.
7.
CREATE TRIGGER update_totaltime AFTER INSERT ON jos_k2_items
FOR EACH ROW
BEGIN
  UPDATE jos_k2_totaltime SET 
    plustime  = SUBSTRING(NEW.extra_fields FROM (POSITION('"id":"10"' IN NEW.extra_fields) + 18) FOR 8),
    totaltime = SEC_TO_TIME(TIME_TO_SEC(plustime) + TIME_TO_SEC(totaltime));
END



выдаёт ошибку "#1064 - 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 '' at line 6 "
...
Рейтинг: 0 / 0
30.04.2014, 16:44:19
    #38630410
manfredima
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update через суммирование из разных таблиц
вообще, по записи, ошибка в строке 5.
но и в случае заведомо неверной 'id:10' - ошибка всё равно есть
...
Рейтинг: 0 / 0
30.04.2014, 16:52:46
    #38630419
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update через суммирование из разных таблиц
manfredimaна этот код

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
DELIMITER //
CREATE TRIGGER update_totaltime AFTER INSERT ON jos_k2_items
FOR EACH ROW
BEGIN
  UPDATE jos_k2_totaltime SET 
    plustime  = SUBSTRING(NEW.extra_fields FROM (POSITION('"id":"10"' IN NEW.extra_fields) + 18) FOR 8),
    totaltime = SEC_TO_TIME(TIME_TO_SEC(plustime) + TIME_TO_SEC(totaltime));
END;
//



выдаёт ошибку "#1064 - 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 '' at line 6 "
...
Рейтинг: 0 / 0
30.04.2014, 17:20:14
    #38630457
manfredima
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update через суммирование из разных таблиц
автор#1064 - 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 '//' at line 8
...
Рейтинг: 0 / 0
30.04.2014, 18:01:06
    #38630506
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update через суммирование из разных таблиц
manfredimaавтор#1064 - 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 '//' at line 8
Это где вы такие сообщения находите?
http://sqlfiddle.com/#!2/68304/1
...
Рейтинг: 0 / 0
30.04.2014, 21:28:33
    #38630620
manfredima
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update через суммирование из разных таблиц
в PhpMyAdmin у моего провайдера
...
Рейтинг: 0 / 0
01.05.2014, 10:28:50
    #38630806
manfredima
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update через суммирование из разных таблиц
так что же, в PhpMyAdmin такой триггер записать не получится?
...
Рейтинг: 0 / 0
05.05.2014, 21:46:34
    #38633833
manfredima
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update через суммирование из разных таблиц
вот такую запись принял PHPMyAdmin:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DELIMITER //
CREATE TRIGGER update_totaltime AFTER INSERT ON jos_k2_items
FOR EACH ROW
BEGIN
  UPDATE jos_k2_totaltime SET 
    plustime  = SUBSTRING(NEW.extra_fields FROM (POSITION('"id":"10"' IN NEW.extra_fields) + 18) FOR 8),
    totaltime = SEC_TO_TIME(TIME_TO_SEC(plustime) + TIME_TO_SEC(totaltime));
END;
//
DELIMITER ;



т.е. после // должно стоять DELIMITER ;
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / update через суммирование из разных таблиц / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]