web-dev-qa-db-fra.com

Mysql 1050 Erreur "La table existe déjà" alors qu'en fait, elle ne

J'ajoute ce tableau:

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

Et je reçois un 1050 "la table existe déjà"

Mais la table n'existe pas. Des idées?

EDIT: plus de détails car tout le monde semble ne pas me croire :)

DESCRIBE contenttype

rendements:

1146 - La table 'gunzfact_vbforumdb.contenttype' n'existe pas

et

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

Rendements:

1050 - La table 'contenttype' existe déjà

61
Citizen

On dirait que vous avez la table de Schroedinger ... 

Sérieusement maintenant, vous avez probablement une table cassée. Essayer:

  • DROP TABLE IF EXISTS contenttype
  • REPAIR TABLE contenttype
  • Si vous avez les autorisations suffisantes, supprimez les fichiers de données (dans/mysql/data/nom_bd)
64
NullUserException

depuis le journal 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

J'ai eu cette même erreur, et REPAIR TABLE (de la réponse de @ NullUserException) n'a pas aidé.

J'ai finalement trouvé cette solution :

Sudo mysqladmin flush-tables

Pour moi, sans la Sudo, j'ai l'erreur suivante:

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

(Sous OS X 10.6)

14
Craig Walker

Vous devrez peut-être vider le cache de la table. Par exemple:

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

Rencontrant le même problème (créer une table InnoDB), voici ce qui a finalement fonctionné pour moi:

DROP DATABASE `having_issues`;

J'ai vérifié sur une base de fichier, les autorisations, essayé de réparer et rincer mais rien n'a fonctionné.

Donc, si cette option est une option, déplacez toutes les tables de travail vers une autre base de données, supprimez l’ancienne (vous devrez peut-être supprimer manuellement tous les fichiers du dossier de la base de données avant de les utiliser), renommez la nouvelle 'devrait' être de retour sur votre chemin. Apparemment, tout ce qui est "mis en cache" avec InnoDB est supprimé avec la base de données originale.

4
websheep

Je me suis battu avec cela toute la journée: j'ai un script Perl qui construit un ensemble de tables en faisant d'abord un DROP IF EXISTS ... sur elles, puis CREATEing. La DROP a réussi, mais le CREATE j'ai reçu le message d'erreur suivant: table already exists

J'ai enfin compris: la nouvelle version de MySQL que j'utilise possède un moteur par défaut InnoDB ("show engine\G;"). commencé MySQL, et maintenant je ne reçois plus l'erreur "la table existe déjà".

4
Neal

Le même problème s'est produit avec moi lors de la création d'une vue .. La vue était présente plus tôt que prévu en raison de modifications qui ont été supprimées.

Solution

Vous pouvez faire une chose manuellement.

  1. Allez dans le dossier MySQL où vous l'avez installé
  2. Allez dans le dossier de données à l'intérieur.
  3. Choisissez votre base de données et allez à l'intérieur.
  4. La base de données crée des fichiers au format ".frm".
  5. supprimer le fichier de la table en particulier.
  6. Maintenant, créez à nouveau la table.

Il va créer la table avec succès.

3
Nakul91

J'ai également rencontré ce problème où essayer de créer une table disait que celle-ci existe déjà et que Dropping the table disait qu'elle n'existait pas.

J'ai fait "FLUSH TABLES" et le problème a été résolu.

3
gmize

J'ai eu ce problème sur Win7 dans SQL Maestro pour MySQL 12.3. Énormément irritant, un spectacle en fait. Rien n'a aidé, pas même laisser tomber et recréer la base de données. J'ai la même configuration sur XP et cela fonctionne là-bas. Après avoir lu vos réponses sur les autorisations, je me suis rendu compte que ce devait être les autorisations Win7. J'ai donc lancé MySql en tant qu'administrateur et même si Sql Maestro était exécuté normalement, l'erreur disparaissait. Il doit donc s'agir d'un problème d'autorisations entre Win7 et MySql.

3
Anton

J'ai eu le même cas. Le problème a fini par être des autorisations sur le répertoire parent. 

J'avais copié des fichiers dans et hors de MySQL lors des tests. 

drwx------   3 _mysql  wheel 

n'était pas suffisant, devait être:

-rw-rw----   3 _mysql  wheel 

Désolé de ressusciter.

2
siberian

Commencez par vérifier si vous êtes dans la bonne base de données USE yourDB et essayez Select * from contenttype juste pour voir en quoi elle consiste et si elle existe vraiment ...

2
laurent

Je me bats avec le même problème. Je ne peux pas créer de table, même si elle n'existe pas. J'ai essayé toutes les solutions ci-dessus sans succès.

Ma solution consistait à supprimer les fichiers ib_logfil0, ib_logfile1, ibdata1 et auto.cnf du dossier de données de MySQL; Assurez-vous d’arrêter le service MySQL avant de supprimer ces fichiers.

Ensuite, après avoir redémarré le service, MySQL a recréé ces fichiers et j’ai pu exécuter un script de sauvegarde si toutes mes CREATEs étaient stockées (fichier sqldump).

2
Zvi

J'ai eu le même problème sous Mac OS X et MySQL 5.1.40. J'ai utilisé Eclipse pour éditer mon script SQL, puis j'ai essayé MySQLWorkbench 5.2.28. Il a probablement converti les caractères de nouvelle ligne au format Mac. Je n'avais aucune idée de ce qui n'allait pas dans mon script avant de commenter la première ligne du fichier. Après cela, ce script a été interprété par mysql comme un seul commentaire. J'ai utilisé l'application Mac TextEdit intégrée pour résoudre ce problème. Une fois que les sauts de ligne ont été convertis au format correct, l'erreur 1050 disparaît.

Mise à jour pour les utilisateurs d'Eclipse:

Pour configurer la fin par défaut pour les nouveaux fichiers créés, dans tout l'espace de travail:

Fenêtre -> Préférences -> Général -> Espace de travail -> Nouvelle ligne de fichier texte délimiteur.

Pour convertir des fichiers existants, ouvrez le fichier pour le modifier et pour le fichier en cours de modification, allez au menu:

Fichier -> Convertir les délimiteurs de ligne en

2
Antonio

J'essayais d'importer un fichier de sauvegarde SQL mais j'obtenais l'erreur; 1050 "La table existe déjà"

Ma configuration était: 

  • Windows 7
  • Mysql 5.5.16

Solution:

  1. Changement du moteur de serveur d'InnoDB en MyISAM
  2. Utilisation de phpMyAdmin Suppression de la base de données que je tentais d'importer
  3. Redémarrage du service mysql
  4. J'ai essayé la réimportation et cela a fonctionné
1
KE50

J'avais de gros problèmes avec les erreurs 1050 et 150.

Le problème, pour moi, c’est que j’essayais d’ajouter une contrainte avec ON DELETE SET NULL parmi les conditions. 

Passer à ON DELETE NO ACTION m'a permis d'ajouter les contraintes FK requises.

Malheureusement, les messages d'erreur MySql ne me sont d'aucune aide. J'ai donc dû trouver cette solution de manière itérative, à l'aide des réponses à la question ci-dessus.

1
Ian Lewis

Pour moi, le problème était dû à l’utilisation d’une copie du système de fichiers du répertoire de la base de données mysql au lieu de mysqldump. J'ai quelques tables très volumineuses, principalement MyISAM et quelques tables de cache InnoDB et il n'est pas pratique de mysqldump les données. Puisque nous utilisons toujours MyISAM, XtraBackup n’est pas une option. 

Les mêmes symptômes que ci-dessus m'est arrivé. La table n'est pas là, il n'y a pas de fichiers dans le répertoire qui s'y rapportent, mais il ne peut pas être créé car MySQL pense que c'est là. La table de dépôt dit que ce n'est pas là, la table de création dit que c'est. 

Le problème s'est produit sur deux machines, les deux ont été résolus en copiant des sauvegardes. Cependant, j'ai constaté dans ma sauvegarde qu'il y avait un fichier .MYD et .MYI, même si j'avais l'impression que ces fichiers ne sont pas utilisés pour InnoDB. Les fichiers .MYD et .MYI avaient un propriétaire de root, tandis que le fichier .frm appartenait à mysql. 

Si vous copiez à partir d'une sauvegarde, vérifiez les autorisations de fichier. Les tables vides peuvent fonctionner, mais j'ai choisi d'arrêter et de redémarrer la base de données. 

Bonne chance.

1
Boot Zero

Je viens d'avoir la même erreur, mais je savais que la table existait déjà et je voulais ajouter quelque chose. J'ajoute ma réponse car cette question est numéro 1 pour moi sur Google lorsque je recherche la même erreur mais un scénario légèrement différent. Fondamentalement, j'avais besoin de cocher

"Ajouter une instruction DROP TABLE/VIEW/PROCEDURE/FUNCTION/EVENT/TRIGGER"

Et cela a résolu l'erreur pour moi.

1
pinkp

J'ai eu ce même problème et il semble que le nom de la base de données était sensible à la casse. Ma base de données s'appelle:

Mydatabase

Alors que mon script inclus

USE mydatabase

Une fois que j'ai changé le nom de la base de données pour le cas correct, tout semblait fonctionner. Utilisation de MYSQL Workbench sur MAC OSX

1
paul78

Mon instruction CREATE faisait partie de staging env dump.

J'ai essayé tout ce qui a été mentionné ci-dessus. Je DID N'A PAS eu de solution. Cependant, mon chemin vers la rédemption était:

  1. Je suis tombé sur le fait que (l'un des nombreux éléments) de l'instruction CREATE est passé lorsque j'ai rectifié la sensibilité à la casse des noms de base de données. Cela a cliqué quelque chose. J'ai répété la même chose pour les autres tables.

  2. Cependant, une nouvelle erreur est entrée en scène. Les guillemets droits pour 'commentaires' généraient une erreur de syntaxe. J'étais choqué. les a remplacés mais la nouvelle erreur a commencé à apparaître. Enfin je connaissais la solution.

SOLUTION: Le dump que j'utilisais pourrait provenir d'une autre version de MySql. J'ai obtenu la permission de me connecter au serveur intermédiaire de mise en scène à l'aide du workbench mysql local (installé sur ma machine). Je n'ai pas rdp dans le serveur de transfert pour me connecter à mysql workbench. Créé un dépotoir à partir de là. Ran la décharge et cela a fonctionné comme un bonbon.

1
Yoosaf Abdulla

Ce problème se produit également si une "vue" (table imaginaire) existe dans la base de données sous le même nom que notre nouveau nom de table.

1
webcoder

Dans mon cas, le problème était qu’il y avait une vue portant le même nom que ma table, je devais donc la supprimer pour permettre à l’importation de continuer.

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

Une solution automatisée qui a fonctionné pour moi consiste à remplacer la table de dépôt normale par ce fichier sed lors du dump, ainsi que de supprimer toutes les vues existantes:

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

Ou si vous préférez imprimer dans un fichier pour la sauvegarde

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

Ou si vous avez reçu le fichier vidé et que vous l'importez dans votre base de données

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

Vous avez eu l'idée

Remarque: il est important que vous ajoutiez le ^ au début de la regex de remplacement, car il existe d'autres types de commandes DROP TABLE IF EXISTS dans les sauvegardes que vous ne souhaitez pas toucher.

Vous allez avoir quelque chose comme ça:

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

Pour avoir quelque chose comme ça:

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

Dans mon cas, j'ai trouvé qu'il s'agissait d'un problème avec InnoDB; Je n’ai jamais découvert quel était le problème, mais la création en tant que MyISAM lui permettait de

1
jmadsen

ça alors, j'ai eu le même problème avec le script d'installation osCommerce jusqu'à ce que je sache que le système mysql a de nombreuses bases de données et que la requête create table se copie dans chacun d'eux et ne laisse donc tomber que la table de travail sur la base de données active n'a pas aidé, tous les dbs

1
ulkas

Tu ne vas pas me croire !! Je viens de supprimer un bloc de commentaires de mon fichier .sql et maintenant ça marche !!!!!!!

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;

Le bloc de commentaires supprimé était ceci:

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

J'ai laissé la table problématique seule dans le même fichier .sql. Après avoir supprimé les commentaires, il ne restait plus que du code et l'erreur disparaissait.

1
duckhunt

Votre disque peut aussi être juste plein. (juste eu que)

0
Anton Boutkam