web-dev-qa-db-de.com

Mysql 1050 Fehler "Tabelle ist bereits vorhanden", obwohl dies nicht der Fall ist

Ich füge diese Tabelle hinzu:

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)
);

Und ich bekomme eine 1050 "Tabelle gibt es schon"

Aber der Tisch existiert NICHT. Irgendwelche Ideen?

EDIT: mehr Details, weil mir alle scheinbar nicht glauben :)

DESCRIBE contenttype

ergibt:

1146 - Die Tabelle 'gunzfact_vbforumdb.contenttype' ist nicht vorhanden

und

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 ) ,

Erträge:

1050 - Tabelle 'contenttype' ist bereits vorhanden

61
Citizen

Hört sich an wie Sie Schroedingers Tisch ... 

Ernsthaft, Sie haben wahrscheinlich einen kaputten Tisch. Versuchen:

  • DROP TABLE IF EXISTS contenttype
  • REPAIR TABLE contenttype
  • Wenn Sie über ausreichende Berechtigungen verfügen, löschen Sie die Datendateien (in/mysql/data/db_name).
64

aus MySQL Log:

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

Ich habe den gleichen Fehler erhalten und REPAIR TABLE (von @ NullUserException's Antwort) hat nicht geholfen.

Ich fand schließlich diese Lösung :

Sudo mysqladmin flush-tables

Für mich ohne die Sudo habe ich folgende Fehlermeldung erhalten:

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

(Läuft unter OS X 10.6)

14
Craig Walker

Möglicherweise müssen Sie den Tabellencache leeren. Zum Beispiel:

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

Mit demselben Problem konfrontiert (InnoDB-Tabelle erstellen) hat dies schließlich für mich funktioniert:

DROP DATABASE `having_issues`;

Ich habe auf Dateibasis nach Berechtigungen gesucht, habe REPARATUR und FLUSH versucht, aber nichts hat funktioniert.

Wenn dies eine Option ist, verschieben Sie alle Arbeitstabellen in eine andere DATABASE, und legen Sie die alte ab (möglicherweise müssen Sie vor dem Ablegen alle Dateien manuell aus dem Datenbankordner entfernen) , die neue umbenennen und Sie 'sollte' wieder unterwegs sein. Was auch immer mit InnoDB "zwischengespeichert" wird, wird zusammen mit der ursprünglichen Datenbank gelöscht.

4
websheep

Ich habe den ganzen Tag damit zu kämpfen gehabt: Ich habe ein Perl-Skript, das eine Reihe von Tabellen erstellt, indem ich zuerst einen DROP IF EXISTS ... und dann CREATEing mache. Die DROP war erfolgreich, aber bei CREATE wurde folgende Fehlermeldung angezeigt: table already exists

Endlich bin ich der Sache auf den Grund gegangen: Die neue Version von MySQL, die ich verwende, verfügt über eine Standard-Engine von InnoDB ("show engine\G;"). MySQL gestartet, und jetzt bekomme ich nicht mehr den Fehler "Tabelle existiert".

4
Neal

Das gleiche Problem trat bei mir beim Erstellen einer Ansicht auf .. Die Ansicht war früher vorhanden, aber aufgrund einiger Änderungen wurde sie entfernt. Als ich jedoch versuchte, sie erneut hinzuzufügen, wurde die Fehlermeldung "Ansicht bereits vorhanden" angezeigt.

Lösung

Sie können eine Sache manuell ausführen.

  1. Wechseln Sie in den MySQL-Ordner, in dem Sie es installiert haben
  2. Wechseln Sie in den Datenordner.
  3. Wählen Sie Ihre Datenbank und gehen Sie hinein.
  4. Datenbank erstellt ".frm" -Formatdateien.
  5. löschen Sie die Datei der jeweiligen Tabelle.
  6. Nun erstellen Sie die Tabelle erneut.

Die Tabelle wird erfolgreich erstellt.

3
Nakul91

Dieses Problem ist auch aufgetreten, als beim Versuch, eine Tabelle zu erstellen, angegeben wurde, dass diese bereits vorhanden ist.

Ich habe "FLUSH TABLES" gemacht und das Problem wurde behoben.

3
gmize

Ich hatte dieses Problem unter Win7 in Sql Maestro für MySql 12.3. Enorm irritierend, tatsächlich ein Show-Stopper. Nichts hat geholfen, nicht einmal die Datenbank gelöscht und neu erstellt. Ich habe das gleiche Setup auf XP und funktioniert dort. Nachdem ich Ihre Antworten zu Berechtigungen gelesen hatte, wurde mir klar, dass es sich um Win7-Berechtigungen handeln muss. Also habe ich MySql als Administrator ausgeführt und obwohl Sql Maestro normal ausgeführt wurde, ist der Fehler verschwunden. Es muss also ein Berechtigungsproblem zwischen Win7 und MySql gewesen sein.

3
Anton

Ich hatte denselben Fall. Das Problem waren schließlich Berechtigungen für das übergeordnete Verzeichnis. 

Ich hatte beim Testen Dateien in und aus mysql kopiert. 

drwx------   3 _mysql  wheel 

war nicht genug, musste sein:

-rw-rw----   3 _mysql  wheel 

Entschuldigung, um wiederbelebt zu werden.

2
siberian

Prüfen Sie zuerst, ob Sie sich in der richtigen Datenbank USE yourDB befinden, und versuchen Sie Select * from contenttype, um zu sehen, was es ist und ob es wirklich existiert ...

2
laurent

Ich kämpfe mit dem gleichen Thema. Ich kann keine Tabelle erstellen, obwohl sie nicht existiert. Ich habe alle oben genannten Lösungen ohne Erfolg ausprobiert.

Meine Lösung bestand darin, die Dateien ib_logfil0, ib_logfile1, ibdata1 und auto.cnf aus dem Datenordner von MySQL zu löschen. Stellen Sie sicher, dass Sie zuerst den MySQL-Dienst stoppen, bevor Sie diese Dateien löschen.

Nach dem Neustart des Dienstes erstellte MySQL diese Dateien neu und ich konnte ein Sicherungsskript ausführen, in dem alle meine CREATEs gespeichert waren (eine sqldump-Datei).

2
Zvi

Ich hatte das gleiche Problem bei Mac OS X und MySQL 5.1.40. Ich habe Eclipse verwendet, um mein SQL-Skript zu bearbeiten, und dann versuchte ich es mit MySQLWorkbench 5.2.28. Wahrscheinlich konvertierte er Zeilenumbrüche in das Mac-Format. Ich hatte keine Ahnung, was mit meinem Skript nicht stimmt, bis ich die erste Zeile der Datei auskommentiert habe. Danach wurde dieses Skript von mysql als ein einzelner Kommentar interpretiert. Ich habe die eingebaute TextEdit Mac-Anwendung verwendet, um dieses Problem zu beheben. Nachdem Zeilenumbrüche in das richtige Format konvertiert wurden, ist der Fehler 1050 nicht mehr vorhanden.

Update für Eclipse-Benutzer:

So legen Sie das Standardende für neu erstellte Dateien im gesamten Arbeitsbereich fest:

Fenster -> Einstellungen -> Allgemein -> Arbeitsbereich -> Neue Textdateizeile Trennzeichen.

Um vorhandene Dateien zu konvertieren, öffnen Sie die Datei zum Bearbeiten und für die aktuell bearbeitete Datei. Gehen Sie zum Menü:

Datei -> Zeilentrenner in konvertieren

2
Antonio

Versuchte, eine Backup-SQL-Datei zu importieren, erhielt jedoch den Fehler. 1050 "Tabelle existiert bereits"

Mein Setup war: 

  • Windows 7
  • MySQL 5.5.16

Lösung:

  1. Die Server-Engine wurde von InnoDB in MyISAM geändert
  2. PhpMyAdmin verwenden Die Datenbank, in die ich importieren wollte, wurde gelöscht
  3. Der mysql-Dienst wurde neu gestartet
  4. Versuchte den Re-Import und es hat funktioniert
1
KE50

Ich hatte große Probleme mit den Fehlern 1050 und 150.

Das Problem für mich war, dass ich versuchte, eine Einschränkung mit ON DELETE SET NULL als eine der Bedingungen hinzuzufügen. 

Das Ändern auf ON DELETE NO ACTION erlaubte mir, die erforderlichen FK-Einschränkungen hinzuzufügen.

Leider sind die MySql-Fehlermeldungen äußerst wenig hilfreich, so dass ich diese Lösung iterativ und mit Hilfe der Antworten auf die obige Frage finden musste.

1
Ian Lewis

Für mich wurde das Problem verursacht, wenn eine Dateisystemkopie des mysql-Datenbankverzeichnisses anstelle von mysqldump verwendet wurde. Ich habe einige sehr große Tabellen, hauptsächlich MyISAM und ein paar InnoDB-Cachetabellen, und es ist nicht praktikabel, die Daten zu mysqldumpen. Da wir weiterhin MyISAM ausführen, ist XtraBackup keine Option. 

Die gleichen Symptome wie oben passierten mir. Die Tabelle ist nicht vorhanden. Das Verzeichnis enthält keine Dateien, die zu der Tabelle gehören. Es kann jedoch nicht erstellt werden, da MySQL denkt, dass es dort ist. Drop-Tabelle gibt an, dass es nicht vorhanden ist. 

Das Problem trat auf zwei Maschinen auf, beide wurden durch das Kopieren von Backups behoben. Ich bemerkte jedoch, dass es in meiner Sicherung eine .MYD- und .MYI-Datei gab, obwohl ich der Meinung war, dass diese Dateien nicht für InnoDB verwendet werden. Die .MYD- und .MYI-Dateien hatten einen Besitzer von root, während der .frm von mysql besessen wurde. 

Wenn Sie aus einer Sicherungskopie kopieren, überprüfen Sie die Dateiberechtigungen. Flush-Tabellen könnten funktionieren, aber ich habe mich entschieden, die Datenbank herunterzufahren und neu zu starten. 

Viel Glück.

1
Boot Zero

Ich hatte nur den gleichen Fehler, wusste aber, dass die Tabelle bereits existiert und wollte sie ergänzen. Ich füge meine Antwort hinzu, da diese Frage für mich bei Google als Nr. 1 erscheint, wenn ich nach dem gleichen Fehler suche, aber nach einem etwas anderen Szenario. Grundsätzlich musste ich ankreuzen

"Anweisung DROP TABLE/VIEW/PROCEDURE/FUNCTION/EVENT/TRIGGER hinzufügen"

Und das hat den Fehler für mich behoben.

1
pinkp

Ich hatte das gleiche Problem und es sieht so aus, als ob der Name der Datenbank die Groß- und Kleinschreibung betraf. Meine Datenbank heißt:

Mydatabase

Während mein Skript enthalten ist

USE mydatabase

Nachdem ich den Datenbanknamen in den richtigen Fall geändert hatte, schien alles zu funktionieren. Verwenden von MYSQL Workbench unter MAC OSX

1
paul78

Meine CREATE-Anweisung war Teil des Staging-Env-Dumps.

Ich habe alles, was oben erwähnt wurde, ausprobiert. Ich DID bekomme keine Lösung. Mein Weg zur Erlösung war jedoch:

  1. Ich stolpere über die Tatsache, dass (eine von vielen in) die CREATE-Anweisung durchkam, als ich die Vertraulichkeit der Datenbanknamen korrigierte. Dies hat etwas geklickt. Ich wiederholte dasselbe für die anderen Tische.

  2. Es kam jedoch ein neuer Fehler in die Szene. Die direkten Anführungszeichen für "Kommentare" führten zu einem Syntaxfehler. Ich war schockiert. ersetzte sie, aber der neue Fehler tauchte auf. Endlich wusste ich die Lösung.

LÖSUNG: Der von mir verwendete Speicherauszug war möglicherweise von einer anderen Version von MySql. Ich erhielt die Berechtigung, eine Verbindung zum Staging-MYsql über die lokale (auf meinem Computer installierte) mysql-Workbench herzustellen. Ich habe kein RDP in den Staging-Server geschrieben, um mich beim Staging der MySQL-Workbench anzumelden. Erstellt einen Dump von dort. Lief die Müllkippe und es funktionierte wie ein Bonbon.

1
Yoosaf Abdulla

Dieses Problem tritt auch auf, wenn eine 'Sicht' (imaginäre Tabelle) in der Datenbank mit demselben Namen wie der neue Tabellenname vorhanden ist.

1
webcoder

In meinem Fall bestand das Problem darin, dass es eine Ansicht mit demselben Namen wie meine Tabelle gab. Daher musste ich die Ansicht löschen, damit der Import fortgesetzt werden konnte.

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

Eine automatisierte Lösung, die für mich funktioniert hat, ist das Ersetzen der normalen Drop-Tabelle durch diese Sed während der Sicherung, um auch vorhandene Ansichten zu löschen:

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

Oder wenn Sie lieber in eine Datei zur Sicherung drucken möchten

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

Oder wenn Sie die ausgelesene Datei erhalten haben und Sie sie in Ihre Datenbank importieren

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

Du hast die Idee

Hinweis: Es ist wichtig, dass Sie den ^ am Anfang des Regex der Ersetzung hinzufügen, da es in Dumps andere Arten von DROP TABLE IF EXISTS-Befehlen gibt, die Sie nicht berühren möchten.

Sie gehen davon aus, so etwas zu haben:

--
-- 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` (
...

So etwas zu haben:

--
-- 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

In meinem Fall habe ich festgestellt, dass dies ein Problem mit InnoDB ist. Ich habe nie herausgefunden, was das eigentliche Problem war, aber das Erstellen als MyISAM ermöglichte die Erstellung

1
jmadsen

gosh, ich hatte das gleiche problem mit osCommerce install script, bis ich herausfand, dass das mysql-system viele datenbanken hat und die create table-abfrage sich in jede einzelne kopiert alle dbs

1
ulkas

Du glaubst mir nicht !! Ich habe gerade einen Kommentarblock aus meiner .sql-Datei entfernt und jetzt funktioniert es !!!!!!!

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;

Der gelöschte Kommentarblock war folgender:

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

Ich habe die problematische Tabelle in der gleichen .sql-Datei alleine gelassen. Danach habe ich Kommentare entfernt, nur noch Code übrig und der Fehler verschwindet.

1
duckhunt

Ihre Festplatte ist möglicherweise auch voll. (hatte gerade das)

0
Anton Boutkam