我从未使用过存储过程或函数,只很少使用过 JOIN 函数。
是否有一种方法可以将多个查询存储在一个位置(表、存储过程或存储函数),以更新另一个表中的记录。理想情况下,我希望安排这些查询每晚运行。
我的表不断添加新记录,LINK 通常为 NULL,但我需要根据某些条件填充它(我已针对此示例进行了简化)。我使用 PRODUCT 和其他一些列来确定 LINK 值。
查询示例:
update TABLE set LINK='XYZ' where PRODUCT='X';
update TABLE set LINK='A' where PRODUCT='A' and STYLE='SAMPLE';
update TABLE set LINK='C' where PRODUCT='C' and STYLE='SAMPLE1';
update TABLE set LINK='C2' where PRODUCT='C' and STYLE='SAMPLE2';
一种可能的解决方案是创建第二个表: PRODUCT='X' = LINK='XYZ' 然后我可以使用 JOIN 来更新我的表吗?
此外,有没有办法按计划自动运行这些更新?
提前谢谢您!希望这是有道理的,这是我的第一篇文章,长期读者。
最佳答案
安排查询
- 创建一个文本文件,例如
nightly_update.sql
. - 将这些查询添加到
nightly_update.sql
逐行。 (现在您可以在 MySQL 中使用source
命令执行所有这些查询:source nightly_update.sql;
。请注意,您应该首先执行use your_db_name;
) 在 Linux 上,使用 crontab创建定时任务。任务应该是: 在指定时间执行shell脚本。
emacs -nw /etc/crontab
,添加这一行:
00 1 * * * root /home/my/mytable_auto_update.sh // every 1:00 am to run this script
编写前面提到的shell脚本。以下是如何在 shell 脚本中执行 SQL 命令的示例:
mysql -u$DB_USER -h$DB_HOST -P$DB_PORT -p$DB_PASS <<\EOF // you don't need an '\' in your code use $DB_NAME; source nightly_update.sql; EOF
使用
sudo service cron restart
重新启动 crond .
您应该使用某种策略来避免重复的 SQL 语句,例如删除nightly_update.sql
在你之后source
它,然后在新查询到达时创建一个新查询。
使用 json 更新表格
据我所知,你可以借助插件来实现。而MySQL提供了一个 InnoDB memorycached Plugin它为您提供 NoSQL 风格的界面。
此外,memorycached 插件还不是那么流行,这不是推荐的方法。如果您有兴趣,请仔细查看手册。
关于MySQL 查询存储在一个表中以更新另一表中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48159902/