以下创建表(针对默认的MyISAM)正确执行并创建表:
DROP TABLE IF EXISTS Service
;
CREATE TABLE Service
(
idService
INT,
主要关键(idService
)
);
然而,当在mysql 5.1.69的内置innodb中创建时,它失败了。
DROP TABLE IF EXISTS Service
;
CREATE TABLE Service
(
idService
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 Zervice
(
idService
INT,
主要关键(idService
)
)ENGINE = InnoDB;
更奇怪的是,如果表以大写字母命名为SERVICE,则会创建它。
DROP TABLE IF EXISTS SERVICE
;
CREATE TABLE SERVICE
(
idService
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,其中upper(table_name)='SERVICE'; 不返回任何行。
任何人都可以解释为什么服务这个词可能对5.1的innoDB有重要意义,或者在这种情况下为什么情况很重要(所有服务器都是Ubuntu)?
答案 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个表Service
和SERVICE
。可能是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安装,我无法重现任何问题。也就是说,我可以创建表Service
或SERVICE
,但没有错误。
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也没有报告一个。
如果是这种情况,您可能无法在没有一些激烈步骤的情况下纠正这种情况,例如:
ibdata1
(这是InnoDB存储其数据字典的地方)。我不能保证这是错误的根本原因,但这些步骤会重建数据字典。