对于mysql 5.1.69的innoDB,无法使用名称Service以混合大小写创建表

时间:2013-08-08 03:48:41

标签: mysql innodb

以下创建表(针对默认的MyISAM)正确执行并创建表:

DROP TABLE IF EXISTS Service; CREATE TABLE ServiceidService INT, 主要关键(idService) );

然而,当在mysql 5.1.69的内置innodb中创建时,它失败了。

DROP TABLE IF EXISTS Service; CREATE TABLE ServiceidService INT, 主要关键(idService) )ENGINE = InnoDB;

Error: Can't create table 'myDatabase.Service' (errno: -1)(1005)

内置innodb是插件的不同代码库,但5.1.69的大部分内容似乎与1.0.3的插件类似 - 它是内置的innodb正在使用。

如果该表在同一服务器上命名为Zervice,则它对InnoDB正常工作。

DROP TABLE IF EXISTS Zervice; CREATE TABLE ZerviceidService INT, 主要关键(idService) )ENGINE = InnoDB;

更奇怪的是,如果表以大写字母命名为SERVICE,则会创建它。

DROP TABLE IF EXISTS SERVICE; CREATE TABLE SERVICEidService INT, 主要关键(idService) )ENGINE = InnoDB;

然而,我正在创建许多其他表格,其他名称在大小写混合的情况下没有任何问题。我手动和mysql工作台都无法针对innoDB创建表Service。

另外在另一台运行5.0的服务器上,该表可以在innoDB中创建为Service,并且已经运行了一段时间(在上面的测试中我使用的是我已经执行并测试过的剪切表)。

单词Service不在mysql的关键字页面(http://dev.mysql.com/doc/refman/5.1/en/reserved-words.html)上列出,但问题似乎是innoDB特定的,如果有任何意图,则没有单独的innoDB关键字列表。另请注意,左倾斜引号正在表名周围使用。

从information_schema.TABLES中选择table_name,其中up​​per(table_name)='SERVICE'; 不返回任何行。

任何人都可以解释为什么服务这个词可能对5.1的innoDB有重要意义,或者在这种情况下为什么情况很重要(所有服务器都是Ubuntu)?

2 个答案:

答案 0 :(得分:0)

您可以创建名为Service的表格。我查了MySQL 5.5.32

以下为我工作

DROP TABLE IF EXISTS `Service`; CREATE TABLE `Service` ( idService INT, PRIMARY KEY (idService) );
DROP TABLE IF EXISTS Service; CREATE TABLE Service ( idService INT, PRIMARY KEY (idService) ) ENGINE=InnoDB;

当我执行上述2个命令时,我得到2个表ServiceSERVICE。可能是mysql 5.1.69中的错误(不知道)。尽可能尝试升级MySQL。

下表详述。

Name       Engine    Rows    Data Size   Index Size    Total Size
-----------------------------------------------------------------
SERVICE    InnoDB     0        16K           0            16K
Service    InnoDB     0        16K           0            16K

SHOW VARIABLES LIKE '%version%'

的输出
Variable_name              Value
---------------------------------
innodb_version             5.5.32
protocol_version           10
slave_type_conversions
version                    5.5.32
version_comment            MySQL Community Server (GPL)
version_compile_machine    x86_64
version_compile_os         Linux

答案 1 :(得分:0)

http://dev.mysql.com/doc/refman/5.1/en/innodb-error-codes.html

  

1005(ER_CANT_CREATE_TABLE)

     

无法创建表格。如果错误消息引用错误150,则表创建失败,因为未正确形成外键约束。如果错误消息引用错误-1,则表创建可能失败,因为该表包含与内部InnoDB表的名称匹配的列名。

所以它不是一个SQL保留字,但它显然与InnoDB中的某些东西冲突。

PS:我强烈建议您只使用InnoDB插件,如果您使用的是MySQL 5.1.69,请不要使用内置的InnoDB。见http://dev.mysql.com/doc/refman/5.1/en/replacing-builtin-innodb.html


更新:我自己尝试了MySQL社区版5.1.70的MySQL Sandbox安装,我无法重现任何问题。也就是说,我可以创建表ServiceSERVICE,但没有错误。

select table_name from information_schema.TABLES where upper(table_name) = 'SERVICE';
+------------+
| table_name |
+------------+
| SERVICE    |
| Service    |
+------------+

show create table Service\G

CREATE TABLE `Service` (
  `idService` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`idService`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

有一段时间我发现InnoDB的数据字典感到困惑。无论是通过腐败,还是做一些不可取的事情,比如使用rm而不是使用DROP TABLE删除MySQL外的InnoDB表。因此,内部数据字典可能会认为您仍然有一个名为Service的表,即使您在磁盘上没有一个表,并且information_schema也没有报告一个。

如果是这种情况,您可能无法在没有一些激烈步骤的情况下纠正这种情况,例如:

  1. 暂时将所有InnoDB表转换为MyISAM。
  2. 关闭mysqld。
  3. 删除ibdata1(这是InnoDB存储其数据字典的地方)。
  4. 启动mysqld。
  5. 将所有表格重新转换回InnoDB。
  6. 我不能保证这是错误的根本原因,但这些步骤会重建数据字典。