【问题标题】:Overriding an implied database in a MySQL UNION?覆盖 MySQL UNION 中的隐含数据库?
【发布时间】:2013-01-18 15:44:04
【问题描述】:

我发誓,这仅用于教育目的......

MySQL 查询如下所示:

SELECT * 
FROM mytable 
where name='value' AND addr='value' 
UNION SELECT * 
      FROM mysql.user;

但我得到的错误是没有mysql.mytable table

我可以在我的 union 或其中任何一个值中做些什么来使我的查询有效吗?除了在代码中明确说明mytable 数据库名称之外?假设我无法在“值”之前更改查询中的任何内容。

【问题讨论】:

  • 你的查询是错误的......你想做什么? ...在information_schema 中没有像mytableuser 这样的表

标签: mysql select union


【解决方案1】:

不清楚您要从information_schema.user 中选择什么。 information_schema 是标准的 MySQL 数据库,默认情况下它就在那里。但是此数据库中没有user 表。

要查看数据库列表,请在 MySQL 控制台中执行此操作:

show databases;

查看数据库中的表:

use information_schema
show tables;

从您所说的来看,您似乎默认使用information_schema 数据库。此外,您尝试在此数据库中选择 mytable,此表似乎也不存在。你能运行上面的命令并向我们展示输出吗?

更新:如果您需要从两个不同的数据库中进行选择:

select * from mydatabase.mytable union select * from mysql.users

如果mytable 在您当前的数据库中,则删除mydatabase,或者提供数据库的正确名称。 mydatabase 这里只是一个例子。

但是,正如已经向您指出的那样,您应该在两个表中具有相同的列,或者指定要从每个表中选择相同的列。

【讨论】:

  • 谢谢马克西莫夫。抱歉,我应该写 mysql.user 表而不是 information_schema。存在同样的问题。我得到一个错误,没有 mysql.mytable,这是正确的。 mytable 存在于服务器上的某个其他数据库中。
  • 谢谢 maksimov,是的,我知道明确说明 mytable 来自的数据库将使联合工作,但如果不存在,是否不可能使查询有效?如果不是,那么这似乎是“意外安全”。
  • 显然您在运行此查询之前没有正确选择数据库。查询应该从存在mytable 的数据库中运行(注意如何明确提到mysql.user),但是您的错误表明您选择了mysql,这是错误的。
【解决方案2】:

对于功能有效的 UNION 子句,您必须在两个查询中具有相同的列。选择中缺少列,使用别名突出显示默认 NULL:

Select *, NULL as "column1" FROM table1 ...

【讨论】:

  • 谢谢 throrin19,列数不是问题,是 MySQL 假设 mytable 与用户在同一个数据库中,但事实并非如此。所以这就是错误。
猜你喜欢
  • 1970-01-01
  • 2013-09-07
  • 2013-10-06
  • 1970-01-01
  • 2015-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-28
相关资源
最近更新 更多