Помилка Mysql 1050 "Таблиця вже існує", а насправді її немає


74

Я додаю цю таблицю:

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' уже існує


5
Як визначити, що він ще не існує?
OMG Ponies

1
Ви перебуваєте в базі даних, в якій ви збираєтеся створити таблицю? Крім того, спробуйте запустити DESCRIBE contenttypeі перевірте, чи насправді він існує.
BoltClock

1
Що робить вас настільки впевненим, що його не існує?
Фоско,

8
Перевірте мій відредагований допис. Я не ідіот :) Він точно не існує.
Громадянин

2
Переживши цю проблему з перенесенням WP, куди я експортував базу даних MySQL з робочого сервера, і спробував імпортувати db на моєму локальному комп'ютері, я виявив, що SQL чомусь "подвоївся" в моєму db export sql. Тобто, іншими словами, мій sql намагався створити одну і ту ж таблицю двічі в одному файлі імпорту / SQL, хоча, коли я оновлював, вона не відображалася. Я вирішив скопіювати та вставити лише туди, де не намагалася створити другу таблицю.
ТАРКУС

Відповіді:


77

Схоже , у вас є таблиця Шредінгера ...

А якщо серйозно, то у вас, мабуть, розбитий стіл. Спробуйте:

  • DROP TABLE IF EXISTS contenttype
  • REPAIR TABLE contenttype
  • Якщо у вас є достатньо дозволів, видаліть файли даних (у / mysql / data / db_name)

2
> ТАБЛИЦЯ РЕМОНТУ contenttype USE_FRM видає gunzfact_vbforumdb.contenttype Помилка відновлення Помилка Не вдається відкрити таблицю gunzfact_vbforumdb.contenttype Статус ремонту Операція не вдалася. Отже, ми наближаємось, але все ще не маємо дозволу. Я не знаю, чи потрібні дані в таблиці, чи існує інший спосіб їх виправити? Я також побіг мійзамк, не маючи удачі.
Громадянин

Чи можете отримати доступ до файлів * .myi, * .myd, * .frm для таблиць?
NullUserException

@Citizen Це фактичні файли, де зберігаються дані таблиці та інформація про структуру. Зазвичай вони знаходяться десь у папці mysql.
NullUserException

Просто голова до будь-кого іншого, стіл справді існував, але був повністю зруйнований. Ніщо не виявило б цього, але я міг кинути стіл.
Громадянин

6
Нещодавно у мене також була ця проблема. Ця публікація допомогла мені її вирішити. Однак виконання ТАБЛИЦІ ПАДАННЯ, ЩО ІСНУЄ, за якою слідує ТАБЛИЦЯ РЕМОНТУ в тій самій таблиці, спричинило помилку через виклик ремонту на неіснуючій таблиці. Здавалося б, для мене працювало лише ТАБЛИЦЯ ПАДАННЯ, ЯКЩО ІСНУЄ.
AndyG

34

з журналу 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.

1
У мене це спрацювало. Але доведеться повторити для всіх таблиць у моїй базі даних.
Darshan Thanki

так, схоже, це може бути спричинено зміною таблиці InnoDB на MyISAM за допомогою механізму ALTER TABLE ** движка MyISAM. mysqlhotcopy також міг брати участь у створенні моєї проблеми, оскільки вона не працює з таблицями InnoDB, і ця, можливо, все ще була InnoDB, коли я вперше виконав команду.
глибока зима

1
У мене не працює ... Таблиця все ще не існує, хоча зараз у мене є діючі файли * .frm та * .ibd.
Домі

1
переконайтеся, що mysql має дозволи на файл # sql-ibXXX.frm
tiger.seo

Щиро дякую ... Ніколи цього не отримував із журналу, але він насправді працював.
П’єр

14

Можливо, вам доведеться очистити кеш таблиці. Наприклад:

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

1
спасибі, ти врятував мене, дещо, як моя схема отримала корупцію (я не міг її скинути), тому я видаляю всі файли, але продовжую отримувати однакову помилку, поки не спробував це
Хуан Антоніо Ороско

не забудьте перезапустити свої служби SQL.
IRvanFauziE

Працює на мене!
negrotico19

14

Я отримав цю саму помилку, і ТАБЛИЦЯ РЕМОНТУ (з відповіді @ NullUserException) не допомогла.

Врешті-решт я знайшов таке рішення :

sudo mysqladmin flush-tables

Для мене, без sudo, я отримав таку помилку:

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

(Працює на OS X 10.6)


1
Дякую, sudo mysqladmin flush-tablesвирішено проблему для мене.
віт

4

Я боровся з цим цілий день: у мене є скрипт Perl, який створює набір таблиць, спочатку роблячи DROP IF EXISTS ...на них, а потім CREATEдодаючи їх. Це DROPвдалося, але CREATEя отримав таке повідомлення про помилку: table already exists

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


не працював у мене. Змінено глобальний движок MySQL з InnoDB на MyISAM - така сама проблема існує / не існує. Сервер MySQL, що працює під управлінням Windows 2003.
Пакташ,

4

Та сама проблема сталася зі мною під час створення представлення даних. Погляд був присутній раніше, через деякі зміни, які він видалив, але коли я спробував додати його знову, він показував мені повідомлення про помилку "вигляд уже існує".

Рішення :

Ви можете зробити одну справу вручну.

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

Це створить таблицю успішно.


4

Зіткнувшись з тією ж проблемою (створити таблицю InnoDB), це, нарешті, спрацювало для мене:

DROP DATABASE `having_issues`;

Я перевіряв на базі файлів, дозволи, намагався РЕМОНТУВАТИ та ВИМИКАТИ, але нічого не вийшло.

Отже, якщо це варіант, перенесіть усі робочі таблиці в іншу БАЗУ БД , відкиньте стару (можливо, доведеться вручну видалити будь-які файли з папки бази даних перед тим, як падіння працюватиме) , перейменуйте нову, і ви повинні назад на ваш шлях. Очевидно, все, що "кешується" за допомогою InnoDB, викидається разом із вихідною базою даних.


1
Я також пропрацював усі інші ідеї, які бачив тут, але це було єдиним, що спрацювало. Очевидно, що база даних у поточних версіях MySQL (принаймні на моїй установці WAMPP) має певну кешовану інформацію, яка унеможливила її просто виправлення, видаливши осиротілий ibdфайл. Флеш-таблиці, РЕМОНТНИЙ СТОЛ тощо не працювали.
Домі

3

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


3

Я також зіткнувся з цією проблемою, коли при спробі Створити таблицю сказали, що вона вже існує, а, скинувши таблицю, сказали, що вона не існує.

Я зробив "ПРОМИВНІ ТАБЛИЦІ", і це зникло.


3

Я борюся з тим самим питанням. Я не можу створити таблицю, хоча вона не існує. Я спробував усі вищезазначені рішення без успіху.

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

Потім після перезапуску служби MySQL відтворив ці файли, і я зміг запустити сценарій резервного копіювання, коли всі мої файли CREATEбули збережені (файл sqldump).


Це спрацювало для мене, разом із тим, що спочатку кинув стіл. Дякую :)
RustyIngles

У мене є повна резервна копія папки MySQL (usr / local / var / mysql), після перевстановлення mysql (brew), коли я намагаюся замінити цю папку резервної копії, моя стара вся база даних, що відображається, не існує :( чи можете ви допомогти мені, як можна Я це виправляю?
Джахірул Іслам Мамун

2

Спочатку перевірте, чи потрапили ви в потрібну базу даних, USE yourDBі спробуйте Select * from contenttypeпросто побачити, що це таке, і чи існує вона насправді ...


2

У мене була та ж проблема в Mac OS X і MySQL 5.1.40. Я використовував eclipse для редагування мого сценарію SQL, і тоді я спробував MySQLWorkbench 5.2.28. Можливо, він перетворив символи нового рядка у формат Mac. Я не уявляв, що не так із моїм сценарієм, поки не прокоментував перший рядок у файлі. Після цього цей сценарій інтерпретувався mysql як єдиний коментар. Я використав вбудовану програму TextEdit Mac, щоб виправити це. Після перетворення рядків у правильний формат помилка 1050 зникла.

Оновлення для користувачів Eclipse:

Щоб налаштувати закінчення за замовчуванням для нових створених файлів у всій робочій області:

Вікно -> Налаштування -> Загальне -> Робоча область -> Розділювач нового рядка текстового файлу.

Щоб перетворити існуючі файли, відкрийте файл для редагування, а для поточно відредагованого файлу перейдіть до меню:

Файл -> Перетворити роздільники рядків на


2

У мене був той самий випадок. Проблема виявилася дозволами на батьківський каталог.

Я копіював файли в та з mysql під час тестування.

drwx------   3 _mysql  wheel 

було недостатньо, потрібно було:

-rw-rw----   3 _mysql  wheel 

Вибачте за воскресіння.


2

У мене були величезні проблеми з помилками 1050 та 150.

Проблема для мене полягала в тому, що я намагався додати обмеження ON DELETE SET NULLяк одну з умов.

Зміна на ON DELETE NO ACTIONдозволило мені додати необхідні обмеження FK.

На жаль, повідомлення про помилки MySql абсолютно не корисні, тому мені довелося знаходити це рішення ітеративно та за допомогою відповідей на вищезазначене питання.


1

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

Mydatabase

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

USE mydatabase

Після того, як я змінив назву бази даних на правильний регістр, все, здавалося, працювало. Використання MYSQL Workbench на MAC OSX


1

Ця проблема також виникає, якщо в базі даних існує "подання" (уявна таблиця) з таким самим іменем, як і наша нова назва таблиці.


1

У моєму випадку я виявив, що це проблема з InnoDB; Я ніколи не дізнався, в чому полягає справжня проблема, але створення як MyISAM дозволило йому будувати


Як відповідь на jmadsen (можливо, трохи пізно ....) у мене була та сама проблема, і причина полягала в тому, що таблиця була створена в сховищі InnoDB, а відповідний .frm-файл був видалений за межами MySQL. Тож я відновив файл .frm із резервної копії і зміг відновити / видалити / відтворити таблицю. З повагою, Roland Leurs
Roland Leurs

1

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

Зі мною трапились ті самі симптоми, що і вище. Таблиці немає, у каталозі немає файлів, що стосуються таблиці, але її неможливо створити, оскільки MySQL вважає, що вона там є. Скинути таблицю говорить, що її там немає, створити таблицю каже, що є.

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

Якщо ви копіюєте з резервної копії, перевірте дозволи на файл. Флеш-таблиці можуть працювати, але я вирішив вимкнути та перезапустити базу даних.

Удачі.


1

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


1

Моя заява CREATE була частиною організації дампа env.

Я спробував усе, що було згадано вище. Я НЕ отримав рішення. Однак мій шлях до викупу був:

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

  2. Однак на місці виникла нова помилка. Прямі лапки для "коментарів" викликали синтаксичну помилку. Я був шокований. замінив їх, але нова помилка почала з’являтися. Нарешті я знав рішення.

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


1

Намагався імпортувати файл резервної копії sql, але отримував помилку; 1050 "Таблиця вже існує"

Моє налаштування було:

  • Windows 7
  • Mysql 5.5.16

Рішення:

  1. Змінено серверний движок з InnoDB на MyISAM
  2. Використання phpMyAdmin Видалив базу даних, яку я намагався імпортувати
  3. Перезапустив службу mysql
  4. Спробував повторний ввезення, і це спрацювало

1

Ваш диск також може бути просто заповненим. (щойно це було)


Я не знаю, чому хтось проголосував за вас. Я радий бачити більше відповідей на інші речі, які могли б бути для когось, хто знайшов це в Google.
Громадянин

1

У моєму випадку проблема полягала в тому, що існував подання з тим самим іменем, що і моя таблиця, тому мені довелося скинути представлення, щоб дозволити імпорт продовжуватись.

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

Ви мені не повірите! Я щойно видалив блок коментарів із мого файлу .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

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

"Додати оператор DROP TABLE / VIEW / PROCEDURE / FUNCTION / EVENT / TRIGGER"

І це вирішило помилку для мене.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.