web-dev-qa-db-ja.com

実際には、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'は既に存在します

67
Citizen

あなたが持っているように聞こえます シュレーディンガーのテーブル ...

真剣に今、あなたはおそらく壊れたテーブルを持っています。試してください:

  • DROP TABLE IF EXISTS contenttype
  • REPAIR TABLE contenttype
  • 十分な権限がある場合は、データファイル(/ mysql/data/db_name内)を削除します
68

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.
31
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` ...
12
Joe Chryst

同じ問題に遭遇した(InnoDBテーブルを作成する)これが最終的に私のために働いたものです:

DROP DATABASE `having_issues`;

ファイル単位でアクセス許可を確認し、修復とフラッシュを試みましたが、何も機能しませんでした。

これがオプションである場合、すべての作業テーブルを別のデータベースに移動し、古いテーブルを削除します(作業する前にデータベースフォルダからファイルを手動で削除する必要があります) 、そしてあなたはあなたの方法に「戻る」べきです。どうやら、InnoDBを使用して「キャッシュ」されるものはすべて、元のデータベースとともにドロップされます。

4
websheep

私はこれと一日中戦っています。最初にDROP IF EXISTS ...を実行し、次にCREATEingを実行して一連のテーブルを作成するPerlスクリプトがあります。 DROPは成功しましたが、CREATEで次のエラーメッセージが表示されました:table already exists

私はついに最後までやりました:使用しているMySQLの新しいバージョンには、InnoDBのデフォルトエンジンがあります( "show engine\G;")my.cnfファイルでMyISAMをデフォルトに変更しました。 MySQLを起動し、「テーブルが既に存在します」というエラーが表示されなくなりました。

4
Neal

ビューの作成中に同じ問題が発生しました。ビューは以前に存在していましたが、いくつかの変更により削除されましたが、再度追加しようとすると、「ビューは既に存在します」というエラーメッセージが表示されていました。

ソリューション

手動で1つのことができます。

  1. インストールしたMySQLフォルダーに移動します
  2. その中のデータフォルダーに移動します。
  3. データベースを選択して、その中に入ります。
  4. データベースは「.frm」形式のファイルを作成します。
  5. 特定のテーブルのファイルを削除します。
  6. 次に、テーブルを再度作成します。

テーブルが正常に作成されます。

3
Nakul91

また、テーブルを作成しようとすると既に存在し、テーブルをドロップすると存在しないと表示されるこの問題に遭遇しました。

「FLUSH TABLES」を実行すると、問題は解決しました。

3
gmize

MySql 12.3のSql MaestroのWin7でこの問題が発生しました。ひどくいらいらする、実はショーストッパー。データベースをドロップして再作成することすら、何も助けになりませんでした。 XPにも同じ設定があり、そこで機能するため、アクセス許可に関する回答を読んだ後、Win7アクセス許可に関連する必要があることに気付きました。そのため、管理者としてMySqlを実行し、Sql Maestroが正常に実行されても、エラーは消えました。したがって、Win7とMySqlの間のアクセス許可の問題であったに違いありません。

3
Anton

これと同じケースがありました。問題は、親ディレクトリのアクセス許可になってしまいました。

私はテスト中にmysqlの内外にファイルをコピーしていました。

drwx------   3 _mysql  wheel 

十分ではありませんでした:

-rw-rw----   3 _mysql  wheel 

復活してすみません。

2
siberian

エラー1050および150で大きな問題が発生していました。

問題は、私にとってON DELETE SET NULLを条件の1つとして制約を追加しようとしていたことです。

ON DELETE NO ACTIONに変更すると、必要なFK制約を追加できました。

残念ながら、MySqlのエラーメッセージはまったく役に立たないので、この解決策を繰り返し見つけ、上記の質問への回答の助けを借りなければなりませんでした。

2
Ian Lewis

まず、正しいデータベースUSE yourDBにいるかどうかを確認し、Select * from contenttypeを試して、それが何であるか、実際に存在するかどうかを確認します...

2
laurent

私は同じ問題に苦しんでいます。テーブルが存在しなくても、作成できません。上記のすべてのソリューションを試してみましたが、成功しませんでした。

私の解決策は、MySQLのデータフォルダーからファイルib_logfil0ib_logfile1ibdata1、およびauto.cnfを削除することでした。これらのファイルを削除する前に、必ずMySQLサービスを停止してください。

その後、サービスを再起動した後、MySQLがこれらのファイルを再作成し、CREATEsがすべて保存されていたバックアップスクリプト(sqldumpファイル)を実行できました。

2
Zvi

Mac OS XとMySQL 5.1.40でも同じ問題がありました。 Eclipseを使用してSQLスクリプトを編集し、MySQLWorkbench 5.2.28を試しました。おそらく、改行文字をMac形式に変換しました。ファイルの最初の行をコメントアウトするまで、スクリプトの何が問題なのかわかりませんでした。この後、このスクリプトはmysqlによって1つのコメントとして解釈されました。これを修正するには、組み込みのTextEdit Macアプリケーションを使用しました。改行が正しい形式に変換された後、エラー1050はなくなりました。

Eclipseユーザー向けの更新:

ワークスペース全体で作成された新しいファイルのデフォルトの終了を設定するには:

ウィンドウ->設定->一般->ワークスペース->新しいテキストファイルの行区切り文字。

既存のファイルを変換するには、編集用にファイルを開き、現在編集中のファイルに対しては、メニューに移動します。

ファイル->行区切り記号の変換

2
Antonio

バックアップSQLファイルをインポートしようとしていましたが、エラーが発生していました。 1050「テーブルは既に存在します」

私のセットアップは:

  • Windows 7
  • Mysql 5.5.16

解決:

  1. サーバーエンジンをInnoDBからMyISAMに変更しました
  2. PhpMyAdminを使用して、インポートしようとしたデータベースを削除しました
  3. Mysqlサービスを再起動しました
  4. 再輸入を試みたが、うまくいった
1
KE50

私にとっては、mysqldumpの代わりにmysqlデータベースディレクトリのファイルシステムコピーを使用すると問題が発生しました。私はいくつかの非常に大きなテーブル、主にMyISAMといくつかのInnoDBキャッシュテーブルを持っていますが、データをmysqldumpすることは実用的ではありません。まだMyISAMを実行しているため、XtraBackupはオプションではありません。

上記と同じ症状が私に起こりました。テーブルは存在せず、ディレクトリにテーブルに関連するファイルはありませんが、MySQLがテーブルを認識しているため、作成できません。テーブルを削除すると、存在しないと表示され、テーブルを作成すると、存在すると表示されます。

この問題は2台のマシンで発生し、両方ともバックアップをコピーすることで修正されました。しかし、バックアップで.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

データベース名を正しい大文字と小文字に変更すると、すべてうまくいくように見えました。 MAC OSXでのMYSQLワークベンチの使用

1
paul78

ディスクもいっぱいになっている可能性があります。 (ちょうどそれを持っていた)

1
Anton Boutkam

CREATEステートメントは、ステージング環境ダンプの一部でした。

上記のすべてを試しました。 I DID解決策が得られません。しかし、償還への私の道は:

  1. データベース名の大文字と小文字の区別を修正したときに、CREATEステートメント(の多くの1つ)が通過したという事実につまずきます。これは何かをクリックしました。他のテーブルについても同じことを繰り返しました。

  2. しかし、新しいエラーが発生しました。 「コメント」の単純な引用符は、構文エラーを投げていました。私はショックを受けました。それらを置き換えましたが、新しいエラーがポップアップし始めました。最後に、私は解決策を知っていました。

解決策:私が使用していたダンプは、MySqlの異なるバージョンのものである可能性があります。ローカル(マシンにインストール済み)mysqlワークベンチを使用してステージングMYsqlに接続する許可を得ました。 mysqlワークベンチのステージングにログインするためにステージングサーバーにrdpしませんでした。そこからダンプを作成しました。ダンプを実行し、それは甘いように働いた。

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

gosh、mysqlシステムに多くのデータベースがあり、create tableクエリが各データベースに自分自身をコピーするまで、osCommerceインストールスクリプトで同じ問題が発生したため、アクティブなdbの作業テーブルのみを削除しました、すべてのデータベースからテーブルを削除する必要がありました

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