MySQL 触发器 - 复制新的。插入的数据与现有的列值进行比较,如果它们匹配,则将它们插入到其他表中

Posted

技术标签:

【中文标题】MySQL 触发器 - 复制新的。插入的数据与现有的列值进行比较,如果它们匹配,则将它们插入到其他表中【英文标题】:MySQL Trigger - Copy NEW. inserted data compare to existing column values and then insert them to other table if they match 【发布时间】:2021-10-05 13:19:32 【问题描述】:

我正在尝试在我的 mysql 数据库中的表 (Cvr_flypn_hooks_501_1000) 上创建一个触发器,该触发器执行以下操作:

对照表中每一行的现有数据 (post_author_id) 值检查传入的插入数据 (new.user_id) 值。 如果匹配,复制一些新的。 INSERTED 行数据列值和一些匹配行现有列数据到新表中的单个新行 (Cvr_flypn_link_501_1000)。 如果它们不匹配,只允许新的。 INSERTED 数据被插入到 Cvr_flypn_hooks_501_1000 表中。

问题 #1:我认为我的第一个问题是在 VALUES 部分,我试图选择要复制的现有匹配值的最后四个值选项,但是当我将其他现有数据添加到VALUES 数组,所以我认为这里有些东西。 问题 #2:我意识到查询也会针对新数据运行,但我不希望它与自身进行比较,我希望这是有道理的。

我已经在下面列出了到目前为止的内容。

IF ( EXISTS(SELECT 1 FROM Cvr_flypn_hooks_501_1000 WHERE post_author_id =  new.user_id)) then
          
          INSERT INTO Cvr_flypn_1_link_501_1000 (a_hook_id, a_user_id, a_post_id, a_post_author_id, b_hook_id, b_user_id, b_post_id, b_post_author)

          VALUES (new.hook_id, 
                  new.user_id, 
                  new.post_id, 
                  new.post_author_id,
                  (SELECT hook_id FROM Cvr_flypn_1_hooks_501_1000 WHERE post_author_id=new.user_id),
        (SELECT user_id FROM Cvr_flypn_1_hooks_501_1000 WHERE post_author_id=new.user_id),
        (SELECT post_id FROM Cvr_flypn_1_hooks_501_1000 WHERE post_author_id=new.user_id),
        (SELECT post_author_id FROM Cvr_flypn_1_hooks_501_1000 WHERE post_author_id=new.user_id));
END IF

非常感谢任何和所有帮助。我对编程很陌生,所以请慢慢来。

【问题讨论】:

请下次添加minimal reproducible example 【参考方案1】:

请记住下次在小提琴中提供数据,如下所示,这样我们就不必每次都重新创建它

Sub-SELECT 只允许返回 1 个值,因此最好添加 ORDER BY 和 A LIMIT 1。

CREATE tABLE Cvr_flypn_1_hooks_501_1000 (hook_id int, user_id int(11) ,post_id int ,post_author_id vaRCHAR(39))
INSERT INTO Cvr_flypn_1_hooks_501_1000 VALUES (1,1,1,"1")
CREATE TABLE account(hook_id int, user_id int(11) ,post_id int, post_author_id int)
CREATE TABLE Cvr_flypn_1_link_501_1000 (a_hook_id int, a_user_id int(11) ,a_post_id int, a_post_author_id int
, b_hook_id int, b_user_id int, b_post_id int, b_post_author int)
CREATE TRIGGER upd_check AFTER  INSERT ON account
       FOR EACH ROW
       BEGIN
IF ( EXISTS(SELECT 1 FROM Cvr_flypn_1_hooks_501_1000 WHERE post_author_id =  new.user_id)) then
          
          INSERT INTO Cvr_flypn_1_link_501_1000 (a_hook_id, a_user_id, a_post_id, a_post_author_id, b_hook_id, b_user_id, b_post_id, b_post_author)

          VALUES (new.hook_id, 
                  new.user_id, 
                  new.post_id, 
                  new.post_author_id,
                  (SELECT hook_id FROM Cvr_flypn_1_hooks_501_1000 WHERE post_author_id=new.user_id ORDER BY hook_id DESC),
        (SELECT user_id FROM Cvr_flypn_1_hooks_501_1000 WHERE post_author_id=new.user_id ORDER BY hook_id DESC),
        (SELECT post_id FROM Cvr_flypn_1_hooks_501_1000 WHERE post_author_id=new.user_id ORDER BY hook_id DESC),
        (SELECT post_author_id FROM Cvr_flypn_1_hooks_501_1000 WHERE post_author_id=new.user_id ORDER BY hook_id DESC));
END IF;

       END
INSERT INTO account VALUES(1,1,1,1)
SELECT * FROM Cvr_flypn_1_link_501_1000
a_hook_id | a_user_id | a_post_id | a_post_author_id | b_hook_id | b_user_id | b_post_id | b_post_author --------: | --------: | --------: | ---------------: | --------: | --------: | --------: | ------------: 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1

db小提琴here

【讨论】:

我将确保以小提琴格式发布(接下来我要查找的是如何做到这一点)。我会看看这是否能解决我的问题。再次感谢您的帮助。 你把我的表名弄混了 所以我试了一下,由于某种原因它仍然挂起。这很奇怪,因为我可以看到您的代码有效,我尝试在小提琴中稍微更改数字并且它有效。 ----我还尝试使用帐户表创建与示例中相同的表结构并为其提供数据,但它不起作用.....我一定在这里遗漏了一些东西。 我只能在您根据需要详细调整结构并查看是否可以重现问题时为您提供帮助。如果你可以在这里发布链接,我会看到,通常它通常只是一个错字,使用表名进行 SELECT * FROM tablea 并且如果它产生结果 copy 表名到查询中并且正如我在 cmets 中所说,与列 nmes 相同,首先是一个选择,然后是 copy,您的示例代码中有一些错别字

以上是关于MySQL 触发器 - 复制新的。插入的数据与现有的列值进行比较,如果它们匹配,则将它们插入到其他表中的主要内容,如果未能解决你的问题,请参考以下文章

插入新行表1复制到表2选定字段后mysql触发器没有重复

MySQL 主从复制,仅在从数据库(Slave)上存在的触发器(Trigger)不会被触发的问题解决

MySQL 主从复制,仅在从数据库(Slave)上存在的触发器(Trigger)不会被触发的问题解决

Mysql触发器插入记录或更新,如果它已经存在? [复制]

从现有数据库创建一个新的 MySQL 数据库,每个表最多包含 10000 行数据

如何编写 MySQL 触发器以将行插入另一个表?