为什么我不能在MySQL中创建表?

时间:2012-01-27 14:35:10

标签: mysql database database-restore

我们以前在MySQL中有一个数据库。在其中,我们有一个名为trace的表。我们早就放弃了整个数据库并创建了另一个同名的数据库。现在,我们尝试从备份脚本重新创建表trace,然后我们得到table already exists。即使新数据库中显然没有表格。如果我尝试创建之前存在的表,我会收到该错误。如果我创建一个从未存在的随机表,那就没关系。

以下是我用来创建表格的代码:

DROP TABLE IF EXISTS `Trace`;
CREATE TABLE `Trace` (
  `TraceKey` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Trace Key',
  `TableName` varchar(100) NOT NULL DEFAULT '' COMMENT 'Table Name',
  `RecordKey` int(10) NOT NULL,
  `Action` varchar(100) NOT NULL DEFAULT '',
  `ActionTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Time Stamp',
  `UserName` varchar(100) NOT NULL DEFAULT '' COMMENT 'UserName',
  PRIMARY KEY (`TraceKey`)
) ENGINE=InnoDB AUTO_INCREMENT=6735 DEFAULT CHARSET=latin1;

错误:

Table 'trace' already exists

我们确实有大约20个表(跟踪是众多的一个),如果有帮助的话,有很多外键。但我们明确放弃了数据库并重新创建了它。

更新

为了测试,我尝试了这个并且它可以工作

CREATE TABLE trace (id INT,data VARCHAR(100));

然而,在删除该表并再次尝试之后:

CREATE TABLE Trace (id INT,data VARCHAR(100));

它不起作用,我收到trace already exists错误。

差异是大写与小写??

更新2

这绝对是一个大写与小写的问题。将表名从Trace更改为trace即使使用旧脚本也可以。

有关为何如此的任何想法?

2 个答案:

答案 0 :(得分:1)

您的MySQL服务器上可能设置了错误的lower_case_table_names设置。可以找到正确的值In MySQL documentation。它声明:

  

如果您只在一个平台上使用MySQL,则通常不必将lower_case_table_names变量从其默认值更改   值。但是,如果要转移,可能会遇到困难   不同文件系统区分大小写的平台之间的表。   例如,在Unix上,您可以有两个名为my_table的表   和MY_TABLE,但在Windows上这两个名称被认为是相同的。   避免数据库或信件箱引起的数据传输问题   表名,你有两个选择:

     
      
  1. 在所有系统上使用lower_case_table_names = 1。这个的主要缺点是当你使用SHOW TABLES或SHOW时   DATABASES,你没有看到原始字母的名字。

  2.   
  3. 在Unix上使用lower_case_table_names = 0,在Windows上使用lower_case_table_names = 2。这保留了字母   数据库和表名。这样做的缺点是你必须这样做   确保您的语句始终引用您的数据库和表   Windows上带有正确字母的名称。如果你转移你的   对Unix的语句,其中lettercase是重要的,它们不起作用   如果字母不正确。

         

    例外:如果您正在使用InnoDB表并且您正试图避免这些数据传输问题,则应进行设置   所有平台上的lower_case_table_names为1以强制名称为   转换为小写。

  4.   

如果您在Windows上使用MySQL并且lower_case_table_names=0,那么您可能会收到此错误,因为MySQL中不存在表Trace(区分大小写)但文件Trace.frm已存在在文件系统上。

答案 1 :(得分:0)

我建议你重启数据库服务器。我以前遇到过类似的问题。