【问题标题】:MySQL Queries stored in one table to update values in another tableMySQL 查询存储在一个表中以更新另一个表中的值
【发布时间】:2018-01-09 00:25:41
【问题描述】:

我从未使用过存储过程或函数,只使用了最少的 JOIN 函数。

有没有办法将多个查询存储在一个位置(表、存储过程或存储函数)以更新另一个表中的记录。理想情况下,我希望将这些查询安排为每晚运行。

我的 TABLE 不断添加新记录,LINK 通常为 NULL,但我需要根据某些条件填充它(我已为此示例进行了简化)。我使用 PRODUCT 和其他一些列来确定 LINK 值是什么。

查询示例:

更新 TABLE set LINK='XYZ' where PRODUCT='X';

更新 TABLE set LINK='A' where PRODUCT='A' and STYLE='SAMPLE';

更新 TABLE set LINK='C' where PRODUCT='C' and STYLE='SAMPLE1';

更新 TABLE set LINK='C2' where PRODUCT='C' and STYLE='SAMPLE2';

一种可能的解决方案是使用以下命令创建第二个表:PRODUCT='X' = LINK='XYZ' 然后我可以使用 JOIN 来更新我的表吗?

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

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

【问题讨论】:

  • 如果PRODUCT='X' 总是意味着STYLE='XYZ';那么STYLE 可能应该在定义PRODUCT 的任何地方。当然,您说您已经简化了它;因此,如果它更复杂,您可能会使用 INSERT trigger 并让它实时发生。
  • 只做一个触发器的问题是每次有新条件时都需要更新触发器。正如您所考虑的,使用一种“映射”表,您只需要更新映射规则并让触发器使用这些规则......但这让我们回到“为什么在 'TABLE' 表中有数据首先,什么时候可以在需要时加入映射表?”
  • @Uueerdo 感谢您的 cmets。我认为触发器可能是一个不错的解决方案,我的标准不会经常改变,但是如果没有对触发器进行更多研究,我想知道管理这些触发器会有多困难(我将有大约 300 个2300 万行的数据库)。我喜欢实时的想法,但这也可能会引入一些我认为的性能问题。我需要对触发器和预定查询进行一些测试。
  • 是的,触发器可以减慢它们所基于的任何操作(INSERT/UPDATE/DELETE);所以如果速度很关键,应该进行测试。

标签: mysql sql join stored-procedures stored-functions


【解决方案1】:

安排查询

  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 语句,例如在source之后删除nightly_update.sql,然后在新查询到达时创建一个新的。

使用 json 更新您的表格

据我所知,你可以借助插件来实现。而 MySQL 提供了一个 InnoDB memorycached Plugin 为您提供 NoSQL 风格的接口。

另外,memorycached 插件不是很流行,这不是推荐的方法。有兴趣的请仔细查看手册。

【讨论】:

  • 谢谢@walter 我会研究这个解决方案来安排我的查询。感谢您的时间和投入帮助我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-11
  • 1970-01-01
  • 2011-02-11
  • 1970-01-01
  • 2011-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多