MySQL 查询存储在一个表中以更新另一表中的值

标签 mysql sql join stored-procedures stored-functions

我从未使用过存储过程或函数,只很少使用过 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 来更新我的表吗?

此外,有没有办法按计划自动运行这些更新?

提前谢谢您!希望这是有道理的,这是我的第一篇文章,长期读者。

最佳答案

安排查询

  1. 创建一个文本文件,例如nightly_update.sql .
  2. 将这些查询添加到 nightly_update.sql逐行。 (现在您可以在 MySQL 中使用 source 命令执行所有这些查询: source nightly_update.sql; 。请注意,您应该首先执行 use your_db_name;)
  3. 在 Linux 上,使用 crontab创建定时任务。任务应该是: 在指定时间执行shell脚本。

    emacs -nw /etc/crontab ,添加这一行:
    00 1 * * * root /home/my/mytable_auto_update.sh // every 1:00 am to run this script

  4. 编写前面提到的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

  5. 使用 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/

相关文章:

php - 如何在PHP中显示表格中的数据

sql - 如何识别特定时间范围内发生的行?

MySQL:订单、限制、订单

php - 使用 JOIN 的 Mysql 查询(LINK 票证、员工、猫、评论)

MySQL 加入最大日期 where 子句

java - Hibernate 在使用 Spring DAO 时不创建表

mysql - 本地数据库和生产环境之间 SQL 查询运行时间的惊人差异

php - 如何在表单值中存储sql列名

java - SQL 更新列从一个表到另一个

mysql - Hibernate 命名查询 - 连接 3 个表