首页 > 解决方案 > 取决于表模式的不同 WHERE 子句

问题描述

我正在尝试使用“mysqldump”命令行工具为数据库制作 mysql 转储,并且正在寻找一些独特的东西。本质上,如果表包含某个列,则根据这些约束进行转储,否则转储整个表。但是由于 mysqldump 命令行选项的性质,这一切都必须在一个 WHERE 子句中。

在伪代码中,这是我必须做的:

if table.columns contains "user_id":
    where = "user_id=1" // dump rows where user_id=1
else:
    where = "TRUE" // dump whole table

但是在所有适用于每个表的 where 子句中,mysqldump 都会遇到

标签: pythonmysqlsqlwhere

解决方案


mysqldump的--where选项可用于将表达式传递给每个表的 SELECT,但它将相同的表达式传递给所有表。

如果需要对不同的表子集使用不同的 WHERE 子句,则需要执行多个 mysqldump 命令,并对不同的表集执行每个命令


回复您的评论:

不,对 SQL 查询中列的引用必须在解析查询时固定,这意味着任何列引用都必须引用表中存在的列。没有办法在 SQL 中创建一个表达式,如果它们确实存在则使用列,如果列不存在则忽略列引用。

要执行您所描述的操作,您必须查询 INFORMATION_SCHEMA 以查看表中存在哪些列,然后根据您发现表中确实存在的列有条件地格式化 SQL 查询以进行转储。

但是在 mysqldump 中,你没有机会这样做。它必须在 mysqldump 的代码中实现。

随意获取 mysqldump 的源代码并向其中添加您自己的逻辑。不过似乎工作量很大。


推荐阅读