在 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'
但是,我尝试手动运行查询并删除webapp
。 SELECT
语句的前缀,它按预期工作,完全没有错误
SELECT `circuits`.* FROM `webapp`.`circuits`
知道为什么会这样吗?
是否与视图的定义方式有关?
编辑
另一个奇怪的事情: 即使此查询失败:
SELECT `webapp`.`circuits`.* FROM `webapp`.`circuits`
这不是:
SELECT `webapp`.`circuits`.Id FROM `webapp`.`circuits`
【问题讨论】:
我感觉您在错误的数据库中创建了视图? @RaymondNijlandSELECT
circuits.* FROM
webapp.
circuits`` 有效,所以没有。 ^^'
前缀 webapp 表示您的数据库名称。检查您的视图是否在此数据库中。
查看他最后的评论@SumeshTG
是的:Screen
【参考方案1】:
我犹豫着回答,因为我对mysql不够熟悉,无法给出完整的答案。不过,我在 rextester.com 上做了一些测试,发现如下:
如果我 create
和 table test(id int)
,我可以使用其完全限定的对象名称来查询它:
SELECT rextester.test.*
FROM rextester.test
工作,没问题。
如果我create
view 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'”的主要内容,如果未能解决你的问题,请参考以下文章
在 database_name 中返回 database_name == ':memory:' 或 'mode=memory' TypeError: 'PosixPath' 类型的参数不可迭代