mysql - MySQL 触发器 - 复制新的。插入的数据与现有的列值进行比较,如果它们匹配,则将它们插入到其他表中
问题描述
我正在尝试在我的 MySQL 数据库中的表 (Cvr_flypn_hooks_501_1000) 上创建一个触发器,该触发器执行以下操作:
- 对照表中每一行的现有数据 (post_author_id) 值检查传入的插入数据 (new.user_id) 值。
- 如果它们匹配,复制一些新的。INSERTED 行数据列值和一些匹配行现有列数据到新表中的单个新行 (Cvr_flypn_link_501_1000)。
- 如果它们不匹配,则只允许 NEW。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
非常感谢任何和所有帮助。我对编程很陌生,所以请慢慢来。
解决方案
请尽量记住下次在小提琴中提供数据,如下所示,这样我们就不必一直重新创建它
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<>在这里摆弄
推荐阅读
- python - pytest 可以忽略特定警告吗?
- c# - System.AggregateException:发生一个或多个错误。(一个任务被取消了。)
- reactjs - 如何将 React 应用程序从 Github 部署到设置了环境变量的 AWS S3 存储桶注意:我没有在 github 中推送 .env 文件
- java - .jar 中没有主要清单属性
- docker - 如何在 docker 映像中增加 activeMQ 的堆内存
- powershell - 仅将新文件移动到其他目录 - Powershell
- sorbet - 使用 bundler 和 dependabot 生成 Sorbet RBI 文件
- excel - Excel:引用传递的范围的每一行中的字段
- azure-devops - 通过 Azure DevOps 通过一个发布流程部署许多应用程序
- pandas - 带有许多列的 Pandas v 0.25 groupby 会导致内存错误