Почему я не могу создать таблицу в MySQL? - PullRequest
0 голосов
/ 27 января 2012

У нас ранее была база данных в 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 таблиц (трассировка была одной из многих), и было много внешних ключей, если это помогло. Но мы явно сбросили БД и воссоздали ее.

UPDATE

Для тестирования я попробовал это, и оно работает

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

Однако, после того, как вы уронили этот стол и попробовали его снова, вот так:

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

Это не работает, и я получаю trace already exists ошибку.

Разница в верхнем и нижнем регистре ??

ОБНОВЛЕНИЕ 2

Это определенно проблема в верхнем и нижнем регистре. Изменение имени таблицы с Trace на trace работает даже при использовании старого скрипта.

Есть идеи, почему это так?

Ответы [ 2 ]

1 голос
/ 27 января 2012

Возможно, на вашем MySQL сервере установлена ​​неправильная настройка lower_case_table_names. Правильные значения можно найти В документации MySQL . В нем говорится:

Если вы используете MySQL только на одной платформе, вам обычно не нужно менять переменную lower_case_table_names по умолчанию значение. Однако вы можете столкнуться с трудностями, если хотите перевести таблицы между платформами, которые отличаются чувствительностью к регистру файловой системы. Например, в Unix вы можете иметь две разные таблицы с именем my_table и MY_TABLE, но в Windows эти два имени считаются идентичными. Во избежание проблем с передачей данных, возникающих из буквенных данных базы данных или имена таблиц, у вас есть два варианта:

  1. Используйте lower_case_table_names = 1 во всех системах. Основным недостатком этого является то, что при использовании SHOW TABLES или SHOW БАЗЫ ДАННЫХ, вы не видите имен в их оригинальных буквах.

  2. Используйте lower_case_table_names = 0 в Unix и lower_case_table_names = 2 в Windows. Это сохраняет буквенный имена баз данных и таблиц. Недостатком этого является то, что вы должны убедитесь, что ваши заявления всегда ссылаются на вашу базу данных и таблицу имена с правильной буквой в Windows. Если вы передадите заявления в Unix, где lettercase имеет значение, они не работают если буква неправильная.

    Исключение: если вы используете таблицы InnoDB и пытаетесь избежать этих проблем с передачей данных, вам следует установить lower_case_table_names to 1 на всех платформах, чтобы имена были преобразован в нижний регистр.

Если вы используете MySQL в Windows и имеете lower_case_table_names=0, вы можете получить эту ошибку, потому что таблица Trace (с учетом регистра) не существует в MySQL, но файл Trace.frm уже существует в файловой системе.

0 голосов
/ 27 января 2012

Я предлагаю вам перезагрузить сервер базы данных.У меня раньше была похожая проблема.

...