在 MySQL 中使用 `database_name`.`viewname`.* 语法进行选择会引发“未知表 'database_name.viewname'”

Posted

技术标签:

【中文标题】在 MySQL 中使用 `database_name`.`viewname`.* 语法进行选择会引发“未知表 \'database_name.viewname\'”【英文标题】:Selecting using `database_name`.`viewname`.* syntax in MySQL throws "Unknown table 'database_name.viewname'"在 MySQL 中使用 `database_name`.`viewname`.* 语法进行选择会引发“未知表 'database_name.viewname'” 【发布时间】:2018-07-25 12:43:03 【问题描述】:

我在使用 mysql 和数据库视图时遇到了一个奇怪的问题。

我有一个这样定义的视图:

CREATE VIEW circuits AS
(SELECT Id, Id AS Old_Id, Name FROM circuits_1)
UNION
(SELECT Id + 1000 AS Id, Id AS Old_Id, Name FROM circuits_2)

我必须将此视图与另一个数据库中的表连接起来。

为此,我通常在表名前加上其数据库名称,例如db_name.table_name

我已经使用 ORM 映射了这个视图,指定了它的前缀,结果查询就是这个:

SELECT `webapp`.`circuits`.* FROM `webapp`.`circuits`

但是这个查询返回这个错误:

#1051 - Unknown table 'webapp.circuits'

但是,我尝试手动运行查询并删除webappSELECT 语句的前缀,它按预期工作,完全没有错误

SELECT `circuits`.* FROM `webapp`.`circuits`

知道为什么会这样吗?

是否与视图的定义方式有关?

编辑

另一个奇怪的事情: 即使此查询失败:

SELECT `webapp`.`circuits`.* FROM `webapp`.`circuits`

这不是:

SELECT `webapp`.`circuits`.Id FROM `webapp`.`circuits`

【问题讨论】:

我感觉您在错误的数据库中创建了视图? @RaymondNijland SELECT circuits.* FROM webapp.circuits`` 有效,所以没有。 ^^' 前缀 webapp 表示您的数据库名称。检查您的视图是否在此数据库中。 查看他最后的评论@SumeshTG 是的:Screen 【参考方案1】:

我犹豫着回答,因为我对mysql不够熟悉,无法给出完整的答案。不过,我在 rextester.com 上做了一些测试,发现如下:

如果我 createtable test(id int),我可以使用其完全限定的对象名称来查询它:

SELECT rextester.test.* 
FROM rextester.test

工作,没问题。

如果我createview so_test as (Select 1 id from dual)

我不能这样做:

SELECT rextester.so_test.* 
FROM rextester.so_test

返回您得到的相同错误。

我不能从中得出太多的结论,因为我对 mysql 的了解不够。但是,这似乎是视图的普遍问题,而不是您创建它的方式。

【讨论】:

如果您使用ALGORITME=MERGE 创建视图,现在想知道吗? 哇,这真的很奇怪。最奇怪的是我在同一个数据库中有另一个视图,它根本没有这个问题。也许这是mysql中的一个错误? @RaymondNijland...我不知道该选项的作用或它如何影响此问题。我把它留给别人做测试。我不得不说,这确实有点像一个错误。 “我不知道该选项的作用或它如何影响这个问题”ALGORITME=MERGE 强制 MySQL 将查询 SELECT rextester.test.* FROM rextester.test 重写(优化)为 Select 1 from dual 它在手册中进行了解释@ 987654321@ "我不得不说,这确实有点像 bug" 是的。 @RaymondNijland 无法自拔,我做了测试,结果相同。【参考方案2】:

MySQL 不支持 * 重写到 VIEW 中匹配的表列。

MySQL 5.6.39 http://sqlfiddle.com/#!9/68f2d3/4

MySQL 5.7 https://www.db-fiddle.com/f/taRV6FLAP6Mf8oMeuniZP3/2

MySQL 8.0.11 https://www.db-fiddle.com/f/taRV6FLAP6Mf8oMeuniZP3/3

【讨论】:

是的,但请检查:sqlfiddle.com/#!9/68f2d3/6 如果您使用 * 代替 Id,则会失败 是的,使用 * 选择列时会出现更多接缝。 是的,使用 * 选择列时会出现更多接缝错误。它发生在所有 MySQL 版本@ProGM 时间来跟踪它。 哎呀,我认为这是某种错误。我会尝试将其报告给 mysql 错误跟踪器 “啊,所以这是某种错误”也许使用* 是不合逻辑的,因为一个视图可以同时访问多个数据库和/或表。也许这就是为什么它从未实施过

以上是关于在 MySQL 中使用 `database_name`.`viewname`.* 语法进行选择会引发“未知表 'database_name.viewname'”的主要内容,如果未能解决你的问题,请参考以下文章

MySQL常用操作

在 database_name 中返回 database_name == ':memory:' 或 'mode=memory' TypeError: 'PosixPath' 类型的参数不可迭代

查询mysql单库的修改时间,大小

php中MYSQL TRUNCATE的使用

如何在 MySQL 中使用命令行导入 SQL 文件?

如何在 MySQL 中使用命令行导入 SQL 文件?