MySQL触发器 - 使用额外值更新关系表

时间:2013-05-10 22:12:55

标签: mysql triggers relational-database

Relation Model

我想要实现的目标是,我希望自动化用户文件夹表之间的表格值。由于这是一个多对多的关系,我创建了 user_folders 表。目前,服务器(nodejs)通过 userid clientfolderid 以及一些书签数组(现在不重要)获取请求。它通过从 user_folders 表中进行选择来检查用户是否已拥有此文件夹,如果它不存在,则会在文件夹表中插入新行。然后它必须发送另一个语句插入 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_id和folder_client_id的 user_folders 表,然后使用user_id和其他多个用户插入 user_folders 默认folder_client_id为-1或稍后将更新的内容。

同时感谢阅读,我希望你能帮助我:)。

PS:m-2-m关系中的其他2个表之间是否有表名?

1 个答案:

答案 0 :(得分: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;
//