MySQL 触发器 - 使用额外值更新关系表
Posted
技术标签:
【中文标题】MySQL 触发器 - 使用额外值更新关系表【英文标题】:MySQL Trigger - Update relation table with extra values 【发布时间】:2013-05-05 16:25:24 【问题描述】:我想要实现的是,我想自动化 users 和 folders 表之间的表值。由于这是一个多对多的关系,我创建了 user_folders 表。当前,服务器(nodejs)使用 userid、clientfolderid 和一些书签数组(现在不重要)获取请求。它通过从 user_folders 表中进行选择来检查用户是否已经拥有此文件夹,如果它不存在,它会在 folder 表中插入一个新行。然后它必须发送另一个语句插入到 user_folders 表中。
所以我必须“手动”更新 users_folder 表。我想这是一个常见问题,想知道是否有模式或经过验证的解决方案?奇怪的是,mysql 使用 AFTER DELETE 触发器自动处理行的删除,但没有(至少我知道)使用 AFTER INSERT 触发器自动化。
正如我已经说过的,AFTER INSERT 触发器可能会解决它,但我认为不可能将一些额外的参数传递给 AFTER INSERT 触发器。在我的例子中,这将是 user_id 和 folder_client_id。
我正在考虑一种解决方案,我可以创建另一个名为 tmp_folder 的表,如下所示:
tmp_folder
-- id
-- title
-- changed
-- user_id
-- folder_client_id
然后在该表上创建一个 AFTER INSERT 触发器,该触发器插入到文件夹和 user_folders 中,然后再次从 tmp_folder 中删除该行。这是正确的方法还是有更好的方法?
我基本上会对书签和 user_bookmarks 表做同样的事情。最好的办法是,如果甚至可以将一个文件夹插入到 user_folders 表中,其中包含 user_id 和 folder_client_id,然后将多个其他用户插入到 user_folders 中,其中包含 user_id 和一个默认的 folder_client_id 为 -1 或稍后会更新的东西。
同时感谢您的阅读,希望您能帮助我:)
PS:在 m-2-m 关系中的其他 2 个表之间是否有表的名称?
【问题讨论】:
【参考方案1】:我没有看到通过触发器执行此操作的简单方法,但存储过程可能适合您:
DELIMITER //
CREATE PROCEDURE
add_user_folder(
IN u_user_id BIGINT UNSIGNED,
IN u_folder_client_id BIGINT UNSIGNED,
IN v_title VARCHAR(255)
)
BEGIN
DECLARE u_found INT UNSIGNED DEFAULT 0;
SELECT
1 INTO u_found
FROM
user_folders
WHERE
user_id = u_user_id AND
folder_client_id = u_folder_client_id;
IF IFNULL(u_found, 0) = 0 THEN
START TRANSACTION;
INSERT INTO
folders
SET
title = v_title,
changed = UNIX_TIMESTAMP();
INSERT INTO
user_folders
SET
user_id = u_user_id,
folder_id = LAST_INSERT_ID(),
folder_client_id = u_folder_client_id;
COMMIT;
END IF;
END;
//
【讨论】:
以上是关于MySQL 触发器 - 使用额外值更新关系表的主要内容,如果未能解决你的问题,请参考以下文章