0

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

如果存在则删除表Service;创建表ServiceidServiceINT,主键(idService));

但是,当在 mysql 5.1.69 的内置 innodb 中创建时,它会失败。

如果存在则删除表Service;创建表ServiceidServiceINT,主键(idService))引擎=InnoDB;

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

内置 innodb 是与插件不同的代码库,但 5.1.69 的大部分内容似乎与 1.0.3 的插件相似——使用的是内置 innodb。

如果该表在同一台服务器上名为 Zervic,则它可以针对 InnoDB 正常工作。

如果存在则删除表Zervice;创建表ZerviceidServiceINT,主键(idService))引擎=InnoDB;

更奇怪的是,如果该表以大写形式命名为 SERVICE,它就会被创建。

如果存在则删除表SERVICE;创建表SERVICEidServiceINT,主键(idService))引擎=InnoDB;

但是,我在混合大小写的情况下创建了许多其他具有其他名称的表,没有任何问题。我手动和 mysql 工作台都无法针对 innoDB 创建表服务。

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

mysql 的关键字页面 ( http://dev.mysql.com/doc/refman/5.1/en/reserved-words.html ) 上没有列出 Service 这个词,但是问题似乎是 innoDB 特定的,并且没有单独的列表innoDB 关键字(如果有的话)。另请注意,表名称周围使用了左斜引号。

从 information_schema.TABLES 中选择表名,其中上(表名)='服务';不返回任何行。

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

4

2 回答 2

1

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

1005 (ER_CANT_CREATE_TABLE)

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

所以它不是 SQL 保留字,但它显然与 InnoDB 中的某些内容冲突。

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


更新:我自己在 MySQL Community edition 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 的数据字典会变得混乱。要么通过损坏,要么做一些不明智的事情,比如在 MySQL 之外删除一个 InnoDB 表,rm而不是使用DROP TABLE. 因此,内部数据字典可能认为您仍然有一个名为的表Service,即使您在磁盘上没有物理上的表,并且 information_schema 没有报告一个表。

如果是这种情况,如果不采取一些激烈的步骤,您可能无法纠正这种情况,例如:

  1. 将所有 InnoDB 表临时转换为 MyISAM。
  2. 关闭mysqld。
  3. 删除ibdata1(这是 InnoDB 存储其数据字典的地方)。
  4. 启动mysqld。
  5. 将所有表重新转换回 InnoDB。

我不能保证这是错误的根本原因,但这些步骤会重建数据字典。

于 2013-08-08T04:15:10.360 回答
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
于 2013-08-08T03:57:19.473 回答