「MySQL」- ERROR 1146: Table ‘xxxx’ doesn’t exist

  CREATED BY JENKINSBOT

问题描述

在执行SELECT语句时,数据库返回1146 - Table 'v_portal.qrtza_triggers' doesn't exist错误。

问题原因

这种问题有很多原因。首先,你要确定表是存在的。

在我们场景中,数据表是存在的,只是「查询语句的表名」与「数据库的表名」大小写是不一致,因此出现问题。

解决办法

数据库的表名大小写是个神奇的问题。

要处理我们的问题,需要修改lower_case_table_names变量。将其设置为lower_case_table_names=1即可。

该变量是全局的,且不能动态修改,只能写入配置文件。只有0、1、2三种取值。值为0表示,不管是定义还是比较都是大小写敏感的;值为1表示,在定义时以小写存储,在比较时大小写不敏感;值为2表示,以定义进行存储,在比较时使用小写。

附加说明

该属性要在建表之前打开。在MariaDB 10.1.29中,测试结果如下:

	(1)将lower_case_table_names=0后,以“Foo”建表,再将lower_case_table_names=1后:
		SELECT * FROM Foo => 成功
		SELECT * FROM foo => 失败
	(2)将lower_case_table_names=1后,以“Foo”建表,保持lower_case_table_names=1后:
		SELECT * FROM Foo => 成功
		SELECT * FROM foo => 成功
	(3)将lower_case_table_names=1后,以“Foo”建表,再将lower_case_table_names=0后:
		SELECT * FROM Foo => 失败
		SELECT * FROM foo => 成功

对于场景(1)分析:虽然官方文档说「设置为1时,表明以小写存储,在比较时不是大小写敏感的」,但是依据情况推测「在比较时,只是将查询语句的表名转为小写」
对于场景(2)分析:该场景容易理解
对于场景(3)分析:在创建后,表名以小写存储。当lower_case_table_names=0后,使用大写表名语句查询,自然会失败。

对于已经创建的表,可以通过REANME语句来转换大小写。

参考文献

MySQL Server Administration/The MySQL Server/Server System Variables/lower_case_table_names
Mysql table name not working in uppercase