我们以前在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
即使使用旧脚本也可以。
有关为何如此的任何想法?
答案 0 :(得分:1)
您的MySQL服务器上可能设置了错误的lower_case_table_names
设置。可以找到正确的值In MySQL documentation。它声明:
如果您只在一个平台上使用MySQL,则通常不必将lower_case_table_names变量从其默认值更改 值。但是,如果要转移,可能会遇到困难 不同文件系统区分大小写的平台之间的表。 例如,在Unix上,您可以有两个名为my_table的表 和MY_TABLE,但在Windows上这两个名称被认为是相同的。 避免数据库或信件箱引起的数据传输问题 表名,你有两个选择:
在所有系统上使用lower_case_table_names = 1。这个的主要缺点是当你使用SHOW TABLES或SHOW时 DATABASES,你没有看到原始字母的名字。
- 醇>
在Unix上使用lower_case_table_names = 0,在Windows上使用lower_case_table_names = 2。这保留了字母 数据库和表名。这样做的缺点是你必须这样做 确保您的语句始终引用您的数据库和表 Windows上带有正确字母的名称。如果你转移你的 对Unix的语句,其中lettercase是重要的,它们不起作用 如果字母不正确。
例外:如果您正在使用InnoDB表并且您正试图避免这些数据传输问题,则应进行设置 所有平台上的lower_case_table_names为1以强制名称为 转换为小写。
如果您在Windows上使用MySQL并且lower_case_table_names=0
,那么您可能会收到此错误,因为MySQL中不存在表Trace
(区分大小写)但文件Trace.frm
已存在在文件系统上。
答案 1 :(得分:0)
我建议你重启数据库服务器。我以前遇到过类似的问题。