以下创建表(针对默认的 MyISAM)正确执行并创建表:
如果存在则删除表服务
;
创建表服务
(
idService
INT,
主键(idService
)
);
但是,当在 mysql 5.1.69 的内置 innodb 中创建时,它会失败。
如果存在则删除表服务
;
创建表服务
(
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 上正常工作。
如果存在则删除表Zervice
;
创建表 Zervice
(
idService
INT,
主键(idService
)
) ENGINE=InnoDB;
更奇怪的是,如果该表以大写形式命名为 SERVICE,则它会被创建。
如果存在则删除表服务
;
创建表 服务
(
idService
INT,
主键(idService
)
) ENGINE=InnoDB;
但是,我使用混合大小写的其他名称创建许多其他表,没有任何问题。我手动和 mysql 工作台都无法针对 innoDB 创建表服务。
此外,在另一台运行 5.0 的服务器上,该表可以在 innoDB 中创建为服务,并且已经这样运行了一段时间(在上面的测试中,我使用了一个已执行和测试的缩减表)。
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)?
最佳答案
http://dev.mysql.com/doc/refman/5.1/en/innodb-error-codes.html
1005 (ER_CANT_CREATE_TABLE)
Cannot create table. If the error message refers to error 150, table creation failed because a foreign key constraint was not correctly formed. If the error message refers to error –1, table creation probably failed because the table includes a column name that matched the name of an internal InnoDB table.
所以它不是 SQL 保留字,但它显然与 InnoDB 中的某些内容冲突。
PS:如果您使用的是 MySQL 5.1.69,我强烈建议您只使用 InnoDB 插件,而不要使用 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 也不会报告该表。
如果是这种情况,如果不采取一些严厉的措施,您可能无法纠正这种情况,例如:
- 暂时将所有 InnoDB 表转换为 MyISAM。
- 关闭 mysqld。
- 删除
ibdata1
(这是 InnoDB 存储其数据字典的位置)。 - 启动 mysqld。
- 将所有表重新转换回 InnoDB。
我不能保证这是错误的根本原因,但这些步骤将重建数据字典。
关于mysql - 无法针对 mysql 5.1.69 的 innoDB 创建名称为混合大小写 Service 的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18117557/