it-swarm.com.ru

Mysql 1050 Ошибка "Таблица уже существует", хотя на самом деле это не так

Я добавляю эту таблицу:

CREATE TABLE contenttype (
        contenttypeid INT UNSIGNED NOT NULL AUTO_INCREMENT,
        class VARBINARY(50) NOT NULL,
        packageid INT UNSIGNED NOT NULL,
        canplace ENUM('0','1') NOT NULL DEFAULT '0',
        cansearch ENUM('0','1') NOT NULL DEFAULT '0',
        cantag ENUM('0','1') DEFAULT '0',
        canattach ENUM('0','1') DEFAULT '0',
        isaggregator ENUM('0', '1') NOT NULL DEFAULT '0',
        PRIMARY KEY (contenttypeid),
        UNIQUE KEY packageclass (packageid, class)
);

И я получаю 1050 "таблица уже существует"

Но таблица не существует. Есть идеи?

Правка: более подробно, потому что все, кажется, не верят мне :)

DESCRIBE contenttype

Результаты:

1146 - Таблица 'gunzfact_vbforumdb.contenttype' не существует

а также

CREATE TABLE gunzfact_vbforumdb.contenttype(
contenttypeid INT UNSIGNED NOT NULL AUTO_INCREMENT ,
class VARBINARY( 50 ) NOT NULL ,
packageid INT UNSIGNED NOT NULL ,
canplace ENUM( '0', '1' ) NOT NULL DEFAULT '0',
cansearch ENUM( '0', '1' ) NOT NULL DEFAULT '0',
cantag ENUM( '0', '1' ) DEFAULT '0',
canattach ENUM( '0', '1' ) DEFAULT '0',
isaggregator ENUM( '0', '1' ) NOT NULL DEFAULT '0',
PRIMARY KEY ( contenttypeid ) ,

Урожайность:

1050 - Таблица 'contenttype' уже существует

61
Citizen

Похоже, у вас есть таблица Шредингера ... 

Серьезно, у вас, вероятно, сломанный стол. Пытаться:

  • DROP TABLE IF EXISTS contenttype
  • REPAIR TABLE contenttype
  • Если у вас достаточно прав, удалите файлы данных (в/mysql/data/db_name)
64
NullUserException

из журнала MySQL:

InnoDB: You can drop the orphaned table inside InnoDB by
InnoDB: creating an InnoDB table with the same name in another
InnoDB: database and copying the .frm file to the current database.
InnoDB: Then MySQL thinks the table exists, and DROP TABLE will
InnoDB: succeed.
29
wredny

Я получил эту же ошибку, и REPAIR TABLE (из ответа @ NullUserException) не помог.

В конце концов я нашел это решение :

Sudo mysqladmin flush-tables

Для меня без Sudo я получил следующую ошибку:

mysqladmin: refresh failed; error: 'Access denied; you need the RELOAD privilege for this operation'

(Работает на OS X 10.6)

14
Craig Walker

Вам может потребоваться очистить кеш таблицы. Например:

DROP TABLE IF EXISTS `tablename` ;
FLUSH TABLES `tablename` ; /* or exclude `tablename` to flush all tables */
CREATE TABLE `tablename` ...
11
Joe Chryst

Столкнувшись с той же проблемой (создать таблицу InnoDB), это то, что, наконец, сработало для меня:

DROP DATABASE `having_issues`;

Я проверил на основе файлов, разрешения, попытался отремонтировать и очистить, но ничего не получалось.

Так что, если это вариант, переместите все рабочие таблицы в другую БАЗУ ДАННЫХ, удалите старую (возможно, вам придется вручную удалить любые файлы из папки базы данных, прежде чем перейти к работе) , переименуйте новую, и вы «должен» вернуться на свой путь. Очевидно, что все, что «кэшируется» с использованием InnoDB, отбрасывается вместе с исходной базой данных.

4
websheep

Я боролся с этим весь день: у меня есть Perl-скрипт, который создает набор таблиц, сначала делая для них DROP IF EXISTS ..., а затем CREATEing их. DROP успешно, но на CREATE я получил это сообщение об ошибке: table already exists

Наконец-то я дошел до сути: в новой версии MySQL, которую я использую, по умолчанию используется движок InnoDB («show engine\G;»), я изменил его в файле my.cnf по умолчанию на MyISAM, повторно запустил MySQL, и теперь я больше не получаю ошибку «таблица уже существует».

4
Neal

Та же проблема возникла у меня при создании представления . Представление присутствовало ранее, тогда как некоторые изменения были удалены, но когда я попытался добавить его снова, он показывал мне сообщение об ошибке «представление уже существует».

Решение

Вы можете сделать одну вещь вручную.

  1. Перейдите в папку MySQL, где вы его установили
  2. Перейдите в папку данных внутри него.
  3. Выберите свою базу данных и зайдите в нее.
  4. База данных создает файлы формата ".frm".
  5. удалить файл конкретной таблицы.
  6. Теперь создайте таблицу снова.

Это создаст таблицу успешно.

3
Nakul91

Я также столкнулся с этой проблемой, когда пытался создать таблицу, которая сказала, что она уже существует, и, удалив таблицу, сказала, что она не существует.

Я сделал "FLUSH TABLES", и это решило проблему.

3
gmize

У меня была эта проблема на Win7 в Sql Maestro для MySql 12.3. Чрезвычайно раздражающий, выставочный ограничитель фактически. Ничего не помогало, даже не сбрасывая и не воссоздавая базу данных. У меня есть такая же настройка на XP, и она работает там, поэтому после прочтения ваших ответов о разрешениях я понял, что это должно быть связано с разрешениями Win7. Поэтому я запустил MySql от имени администратора, и хотя Sql Maestro работал нормально, ошибка исчезла. Так что, должно быть, проблема с правами доступа между Win7 и MySql.

3
Anton

У меня был такой же случай. Проблема закончилась тем, что разрешения для родительского каталога. 

Я копировал файлы в и из mysql во время тестирования. 

drwx------   3 _mysql  wheel 

было недостаточно, нужно было:

-rw-rw----   3 _mysql  wheel 

Извините, что воскресил.

2
siberian

Сначала проверьте, находитесь ли вы в нужной базе данных USE yourDB, и попробуйте Select * from contenttype просто посмотреть, что это такое и действительно ли оно существует ...

2
laurent

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

Мое решение состояло в том, чтобы удалить файлы ib_logfil0, ib_logfile1, ibdata1 и auto.cnf из папки данных MySQL; убедитесь, что остановили службу MySQL перед удалением этих файлов.

Затем после перезапуска службы MySQL заново создал эти файлы, и я смог запустить скрипт резервного копирования, в котором хранились все мои CREATE (файл sqldump).

2
Zvi

У меня была такая же проблема в Mac OS X и MySQL 5.1.40. Я использовал Eclipse для редактирования своего сценария SQL, а затем попробовал MySQLWorkbench 5.2.28. Вероятно, он преобразовал символы новой строки в формат Mac. Я понятия не имел, что не так с моим сценарием, пока не закомментировал первую строку в файле. После этого этот скрипт был интерпретирован mysql как единый комментарий. Я использовал встроенное приложение TextEdit Mac, чтобы исправить это. После того, как разрывы строк были преобразованы в правильный формат, ошибка 1050 исчезла.

Обновление для пользователей Eclipse:

Чтобы установить окончание по умолчанию для новых файлов, созданных во всем рабочем пространстве:

Окно -> Настройки -> Общие -> Рабочая область -> Новая строка текстового файла разделитель.

Чтобы преобразовать существующие файлы, откройте файл для редактирования и для текущего отредактированного файла перейдите в меню:

Файл -> Конвертировать разделители строк в

2
Antonio

Пытался импортировать резервный файл sql, но получал ошибку; 1050 "Таблица уже существует"

Моя установка была: 

  • Windows 7
  • Mysql 5.5.16

Решение:

  1. Изменен серверный движок с InnoDB на MyISAM
  2. Использование phpMyAdmin Удалил базу данных, в которую я пытался импортировать
  3. Перезапустил службу MySQL
  4. Попробовал реимпорт и все заработало
1
KE50

У меня были огромные проблемы с ошибками 1050 и 150.

Проблема для меня заключалась в том, что я пытался добавить ограничение с ON DELETE SET NULL в качестве одного из условий. 

Изменение на ON DELETE NO ACTION позволило мне добавить необходимые ограничения FK.

К сожалению, сообщения об ошибках MySql совершенно бесполезны, поэтому мне пришлось искать это решение многократно и с помощью ответов на вопрос выше.

1
Ian Lewis

Для меня проблема была вызвана использованием копии файловой системы каталога базы данных mysql вместо mysqldump. У меня есть несколько очень больших таблиц, в основном MyISAM и несколько таблиц кеша InnoDB, и mysqldump не практично использовать для данных. Поскольку мы все еще работаем с MyISAM, XtraBackup не вариант. 

Со мной случились те же симптомы, что и выше. Таблицы нет, в каталоге нет файлов, которые относятся к этой таблице, но ее нельзя создать, потому что MySQL считает, что она там есть. Drop table говорит, что это не там, создать таблицу говорит, что это так. 

Проблема возникла на двух машинах, обе были исправлены путем копирования резервных копий. Однако я заметил, что в моей резервной копии были файлы .MYD и .MYI, хотя у меня сложилось впечатление, что эти файлы не используются для InnoDB. Файлы .MYD и .MYI имеют владельца root, а файл .frm принадлежит mysql. 

Если вы копируете из резервной копии, проверьте права доступа к файлу. Сброс таблиц может работать, но я решил закрыть и перезапустить базу данных. 

Удачи.

1
Boot Zero

У меня была такая же ошибка, но я знал, что таблица уже существует, и хотел добавить к ней. Я добавляю свой ответ, так как этот вопрос для меня в Google выглядит как № 1 при поиске той же ошибки, но по немного другому сценарию. В основном мне нужно было поставить галочку

«Добавить оператор DROP TABLE/VIEW/PROCEDURE/FUNCTION/EVENT/TRIGGER»

И это решило ошибку для меня.

1
pinkp

У меня была такая же проблема, и похоже, что имя базы данных чувствительно к регистру. Моя база данных называется:

Mydatabase

Пока мой сценарий включен

USE mydatabase

Как только я изменил имя базы данных на правильный регистр, казалось, что все работает. Использование MYSQL Workbench на MAC OSX

1
paul78

Мое заявление CREATE было частью постановки дампа env.

Я попробовал все, что было упомянуто выше. Я DID НЕ получил решение. Однако мой путь к искуплению был:

  1. Я наткнулся на тот факт, что (один из многих в) оператор CREATE справился, когда я исправил чувствительность к регистру имени базы данных. Это что-то щелкнуло. Я повторил то же самое для других таблиц.

  2. Однако появилась новая ошибка. Прямые кавычки для «комментариев» вызывали синтаксическую ошибку. Я был потрясен. заменил их, но новая ошибка начала появляться. Наконец я знал решение.

РЕШЕНИЕ: Дамп, который я использовал, мог быть из другой версии MySql. Я получил разрешение на подключение к промежуточному MYsql, используя локальный (установленный на моей машине) инструмент MySQL. Я не подключился к промежуточному серверу для входа в рабочую среду mysql. Создал дамп оттуда. Побежал на свалку и все заработало как сладкое.

1
Yoosaf Abdulla

Эта проблема также возникает, если в базе данных существует «представление» (воображаемая таблица) с тем же именем, что и у нашей новой таблицы.

1
webcoder

В моем случае проблема заключалась в том, что существовало представление с тем же именем, что и у моей таблицы, поэтому мне пришлось отбросить представление, чтобы продолжить импорт.

drop view `my-view-that-has-same-name-as-table`;

Автоматическое решение, которое сработало для меня, заключается в замене обычной таблицы удаления этим sed во время дампа, чтобы также отбрасывать любые возможные представления:

mysqldump my-db \
| sed -E 's/^DROP TABLE IF EXISTS(.+)$/\0 DROP VIEW IF EXISTS\1/g' \
| mysql my-other-db

Или, если вы предпочитаете печатать в файл для резервного копирования

mysqldump my-db \
| sed -E 's/^DROP TABLE IF EXISTS(.+)$/\0 DROP VIEW IF EXISTS\1/g' \
> my-db.dump.sql

Или, если вы получили дамп-файл и импортируете его в свою базу данных

cat my-db.dump.sql \
| sed -E 's/^DROP TABLE IF EXISTS(.+)$/\0 DROP VIEW IF EXISTS\1/g' \
| mysql my-other-db

Вы поняли идею

Примечание: важно, чтобы вы добавляли ^ в начале регулярного выражения замены, потому что есть другие типы команд DROP TABLE IF EXISTS в дампах, к которым вы не хотите прикасаться.

Вы идете от того, чтобы иметь что-то вроде этого:

--
-- Table structure for table `my_table`
--

DROP TABLE IF EXISTS `my_table`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `my_table` (
...

Чтобы иметь что-то вроде этого:

--
-- Table structure for table `my_table`
--

DROP TABLE IF EXISTS `my_table`; DROP VIEW IF EXISTS `my_table`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `my_table` (
...
1
santiago arizti

В моем случае я обнаружил, что это проблема с InnoDB; Я никогда не обнаруживал, в чем была проблема, но создание как MyISAM позволило ему построить

1
jmadsen

черт возьми, у меня была та же проблема с установочным скриптом osCommerce, пока я не выяснил, что система mysql имеет много баз данных, и запрос create table копирует себя в каждую, и, таким образом, удаление только рабочей таблицы на активной базе данных не помогло, мне пришлось удалить таблицу из все дбс

1
ulkas

Ты мне не поверишь !! Я просто удалил блок комментариев из моего .sql файла, и теперь он работает !!!!!!!

CREATE DATABASE  IF NOT EXISTS `issga` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `issga`;
--
-- Table structure for table `protocolo`
--

DROP TABLE IF EXISTS protocolo;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
 CREATE TABLE protocolo (
  `idProtocolo` int(11) NOT NULL AUTO_INCREMENT,
  `tipo` varchar(30) DEFAULT NULL,
  `estado` int(2) DEFAULT 0,
  PRIMARY KEY (`idProtocolo`)
 ) ENGINE=InnoDB AUTO_INCREMENT=142 DEFAULT CHARSET=utf8;
 /*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `protocolo`
--

LOCK TABLES protocolo WRITE;
/*!40000 ALTER TABLE protocolo DISABLE KEYS */;
/* INSERT INTO `protocolo` VALUES () */
/*!40000 ALTER TABLE protocolo ENABLE KEYS */;
UNLOCK TABLES;

Удаленный блок комментариев был таким:

--
-- Table structure for table `protocolo`
-- 

Я оставил проблемную таблицу один в том же файле .sql. После этого я удалил комментарии, остался только код, и ошибка исчезла.

1
duckhunt

Ваш диск также может быть просто переполнен. (только что это было)

0
Anton Boutkam