这是一个非常烦人的异常现象,只发生在 phpMyAdmin 中,而不是通过 php 的 mysqli 或 mysql 命令行发生。
我有两个数据库,foo
和 bar
。
foo.bananaTable.monkeyId
是 bar.monkey.id
因此,无论您在哪里执行它,下面的 SQL 都可以按原样正常工作:
SELECT bananaTable.ripeness as 'ripeness'
FROM bar.monkey as monkey
JOIN foo.bananaTable as bananaTable ON bananaTable.monkeyId = monkey.id
现在,如果您导航到 phpMyAdmin 中的 foo
数据库,如果您没有在 SQL 中明确命名,它会有效地使用 foo
作为您的默认数据库。因此,下面的 SQL(在 JOIN 中省略 foo
db 范围)应该工作....
SELECT bananaTable.ripeness as 'ripeness'
FROM bar.monkey as monkey
JOIN bananaTable as bananaTable ON bananaTable.monkeyId = monkey.id
它在 php mysqli 和 mysql 命令行中确实有效。但它在 phpMyAdmin 中不起作用 您收到一条错误消息,提示 #1146 Table "bar.bananaTable"doesn't exist
。
这告诉我 FROM 完全劫持了我在 phpMyAdmin 中的默认数据库。事实上,如果您编辑它并再次运行它,您会注意到它实际上已将您移至 bar
数据库......WTF?
好的,所以我又尝试了一件事情:
USE foo;
SELECT bananaTable.ripeness as 'ripeness'
FROM bar.monkey as monkey
JOIN bananaTable as bananaTable ON bananaTable.monkeyId = monkey.id
...尝试强制它。仍然没有工作!
有人看过吗?这只是 phpMyAdmin 试图变得太聪明的产物吗?有没有以这个为中心的配置?或者这是我需要注意的 MySql 中的一些奇怪之处?我完全支持显式数据库命名,但出于安全原因,我们从一开始就指定默认值。
最佳答案
未指定 phpMyAdmin 版本,但似乎与版本无关。以下测试显示了最新版本的 phpMyAdmin 中的相同行为。在我看来像是一个错误。
-- http://demo.phpmyadmin.net/master-config
-- phpMyAdmin Demo Server: Currently running Git revision RELEASE_4_3_0RC2-1597-g6111104
-- Create table in test database
CREATE TABLE IF NOT EXISTS bar (
id int(11) NOT NULL,
`name` varchar(20) NOT NULL,
fooID int(11) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
INSERT INTO bar (id, name, fooID) VALUES
(1, 'first', 1),
(2, 'second', 2);
ALTER TABLE bar
ADD PRIMARY KEY (id);
-- Create table in world database
CREATE TABLE IF NOT EXISTS `foo` (
`id` int(11) NOT NULL,
`val1` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `foo` (`id`, `val1`) VALUES
(1, 10),
(2, 15);
ALTER TABLE `foo`
ADD PRIMARY KEY (`id`);
-- from world database, where table foo resides
-- this query shows world as the default/selected database, as expected.
SELECT DATABASE();
-- this query should work from world, but fails with #1146 - Table 'test.foo' doesn't exist
SELECT b.*, f.val1
FROM test.bar AS b
LEFT JOIN foo AS f ON f.id = b.fooID
WHERE 1;
-- this query succeeds with an explicit world.foo, but it shouldn't be required
SELECT b.*, f.val1
FROM test.bar AS b
LEFT JOIN world.foo AS f ON f.id = b.fooID
WHERE 1;
关于phpMyAdmin:FROM 后忽略默认数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28376409/