我是MySQL的新手,我很难理解如何跨多个数据库进行查询。
解释基础架构,我目前正在进行一项任务,我所在的公共测试数据库中有一组数据库。
我有一个标识符值,我想搜索我知道存在于特定表中的所有数据库。我将使用表名" table1"对于这个例子。问题是,并非所有数据库都拥有我在表中寻找的标识符列。
我的问题涉及两个部分: - 如何搜索所有数据库以返回包含此列中特定值的所有数据库名称的集合(table1.id) - 如何验证列是否存在,以便我可以实际进行检查以查看我要查找的ID是否与其他数据库匹配。 table1.id值?
为了缩小规模,我制定了检查单个表的代码:
SELECT * FROM table1
WHERE searchId = db1.table1.id;
不同之处在于,我想在确保该列首先存在于表中时,搜索所有数据库table1以获取此特定值。
答案 0 :(得分:1)
您可以通过查询information_schema
:
SELECT column_name
FROM information_schema.columns
WHERE table_schema = 'myschema' -- "database"
AND table_name ='mytablename'
答案 1 :(得分:1)
这应该让你开始:
SELECT table_schema
FROM information_schema.columns
WHERE table_name = 'table1' AND column_name = 'id'
;
通过这种方式,您可以将结果用于您用于编写特定于每个数据库的查询的任何编程语言。
或者,我最近发现了与此类似的临界滥用行为。
SELECT CONCAT("SELECT '", table_schema, "' "
"FROM `", table_schema, "`.`", table_name, "` "
"WHERE `", column_name, "` = ", searchId
) AS qStr
FROM information_schema.columns
WHERE table_name = 'table1' AND column_name = 'id'
;
您将这些结果连接在一起,其间有UNION
,结果查询应该为您提供所有模式的列表,这些模式的表格具有与searchId值匹配的名称(和列)。
编辑:使用单引号替换上面的不当反对,并且......在下面添加了此内容。
SET @criteriaVal := "'somestring'";
-- SET @criteriaVal := 3; -- for example
SELECT CONCAT("SELECT '", table_schema, "' "
"FROM `", table_schema, "`.`", table_name, "` "
"WHERE `", column_name, "` = ", @criteriaVal
) AS qStr
FROM information_schema.columns
WHERE table_name = 'table1' AND column_name = 'id'
;