MySQL Trigger работает не очень хорошо - PullRequest
2 голосов
/ 06 октября 2011

Я работаю с WordPress и мне нужно создать триггер, который обновляет таблицу при обновлении другой. Я создал триггер, и она работала теоретически, но он только обновляет первую запись и приостанавливает ее выполнение. Переменная, используемая для хранения выбора, который возвращает, будет одним из идентификаторов, разделенных запятыми.

Eq: выборка возвращает что-то вроде: 424,532,123,212

И используйте его в обновлении, поставив "в".

UPDATE wp_posts SET e.post_modified = date (NEW.modified_date) e.ID WHERE IN (@ids);

И, как я уже сказал, он обновляет только первую запись в этом случае будет 424

Хотелось бы, чтобы кто-нибудь мне помог.

Вот триггер:

CREATE TRIGGER triggerupdatedata AFTER UPDATE ON wp_ngg_gallery
FOR EACH ROW BEGIN


    set @ids := (SELECT 
        GROUP_CONCAT(a.ID SEPARATOR ',') 
    FROM 
        wp_posts a, wp_postmeta b, wp_ngg_gallery c 
    WHERE 
        c.gid = OLD.gid 
    AND 
        a.ID = b.post_id 
    AND 
        b.meta_key = 'galeria_id' 
    AND 
        c.gid = (SELECT d.meta_value FROM wp_postmeta d WHERE d.post_id = a.ID AND d.meta_key = 'galeria_id')
    );

UPDATE wp_posts e SET e.post_modified = date(NEW.modified_date) WHERE e.ID IN (@ids);

END;//

Ответы [ 2 ]

1 голос
/ 06 октября 2011

Я думаю, что вас укусил анти-шаблон, называемый неявным синтаксисом соединения.
Это вызывает всевозможные проблемы.
Сделайте ваши объединения явными, чтобы вы не заканчивали спаггети перекрестного соединения.

Кроме того, SQL и CSV не смешиваются.

CREATE TRIGGER au_wp_ngg_gallery_each AFTER UPDATE ON wp_ngg_gallery FOR EACH ROW 
BEGIN  
   UPDATE wp_posts e SET e.post_modified = date(NEW.modified_date) WHERE e.ID IN (
     SELECT * FROM (
   SELECT a.id  
   FROM wp_posts p
   INNER JOIN wp_postmeta pm ON  (pm.post_id  = p.id AND pm.meta_key  = 'galeria_id')
   INNER JOIN wp_postmeta pm2 ON (pm2.post_id = p.id AND pm2.meta_key = 'galeria_id')
   /* not sure if the join on pm2 is needed or not */
   INNER JOIN wp_ngg_gallery ng ON (ng.gid = pm2.meta_value)
   WHERE 
      ng.gid = OLD.gid ) sub) subsubhack); 
END // 

Вы не можете update таблицу и select из той же таблицы в подвыборке.

Но вы можете обновить таблицу и выбрать из этой же таблицы в суб-суб-выборе.
Причина в том, что суб-суб-выбор принудительнозапускаться до обновления, тогда как «простой» подвыбор может выполняться одновременно с обновлением, что вызовет всевозможные проблемы.

1 голос
/ 06 октября 2011

Не сохранять значения идентификаторов в переменную.Используйте подзапрос непосредственно в запросе UPDATE.Также, как сказал Йохан, не используйте неявный синтаксис соединения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...