MySQL触发器不能很好地工作
问题描述:
我正在使用wordpress,并且需要创建一个触发器,在另一个更新时更新表。我创建了触发器,她在理论上工作,但它只更新第一条记录并暂停执行。用于存储返回的select的变量将是以逗号分隔的id之一。MySQL触发器不能很好地工作
式:该选择回报是这样的:424532123212
而且通过把“中”的更新中使用它。
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;//
答
我想你已经被称为隐式连接语法的反模式咬了。
它会导致各种问题。
使你的连接明确,所以你不会结束交叉连接spaggeti。
另外,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
。
但是你可以更新表和子子选择从同一个表中选择。
原因是在更新之前,子子选择被强制运行,而“仅仅”子选择可以与更新同时运行,这会导致各种问题。
+0
非常感谢!它只是工作! ; d –
答
ID值不保存到一个变量。在UPDATE查询中直接使用子查询。另外,像约翰说的 - 不使用隐式连接语法。
不要使用隐式SQL '89连接语法它是反模式,而是使用显式连接语法。 – Johan
您是否检查了** @ids **返回的值? – Chandresh