Mysql触发器从一个表到另一个表


Mysql trigger from one table to another

我有一个表a,每次用户发送图像时,都会创建一条记录,存储上传的时间,用户的用户名以及随时间上传的所有图像中的图像编号。

我需要创建第二个表B,它将存储每个用户上传的图像数量和用户名。当a中生成新条目时,我需要更新表B

我发现可以创建一个触发器函数,但是我很难找到一个适合我需要的示例。

有谁知道我想要的方法吗?

只需更新b表,从当前用户NEW.userid中选择a上插入的总记录计数(userid是您的列名或您在那里的任何名称,NEW是要插入的当前值的固定mySql引用):

CREATE TRIGGER img_sum AFTER INSERT ON a
FOR EACH ROW SET b.total =  (SELECT COUNT(*) FROM a WHERE a.userid=NEW.userid)  
WHERE b.userid = NEW.userid;

根据您的描述,我认为您不需要第二张表了。您只需计算用户名出现的次数,就可以得到该用户上传的图像数量。

你可以像这样得到计数

SELECT COUNT(DISTINCT username) FROM table_name;

如果您仍然需要创建2个表,您可能需要查看过程及其工作方式。

假设我们有3个表:

- users(id, username, email ....), 
- user_images(id, userId, image_num, date_uploaded)
- user_images_count(id, user_name, images_count)

user_images_count初始为空。我们必须这样填写:

INSERT into user_images_count(user_name, images_count)
 SELECT (select username from users where ui.userId = id) as username, count(userId) as counter FROM `user_images` ui group by ui.userId;

然后,我们必须立即创建触发器来处理每个INSERT操作到user_images表。

CREATE TRIGGER `count_user_images` AFTER INSERT ON `user_images`
 FOR EACH ROW begin
declare u_name tinytext default "";
set u_name = (select username from users where id = NEW.userId limit 1);
if(u_name != "") then
    update user_images_count set images_count = images_count + 1 where user_name = u_name;
end if;
end

这两个查询(user_images_count实现和触发器创建必须在一个事务中一个接一个地执行)。我在本地数据库中创建了类似的触发器。它们很好用。))