テーブルが存在する場合はテーブルをドロップして作成し、存在しない場合は作成する


151

私は困惑している、これをどうやってやるのかわからない。

基本的にはテーブルを作成したいだけですが、存在する場合は削除して再作成する必要があります。切り捨ては行われませんが、存在しない場合は作成してください。

誰かが助けることができますか?

ありがとう、ジョージ


@Shomz、それは彼らが欲しかったものです。しかし、この質問の存在とこのページへの2万回の表示は、英語をギリシャ語に変換するのと同じくらい簡単であることを証明しています。
Pacerier 2015年

2
@Pacerierはこれ以上同意できませんでした:διαγραφή πίνακα, εφόσον υπάρχει
Shomz 2015年

@Shomz、文法エラーがあります。
Pacerier 2015年

回答:


298

ちょうどDROP TABLE IF EXISTS `tablename`;あなたのCREATE TABLE声明の前に置きます。

そのステートメントはテーブルが存在する場合は削除しますが、存在しない場合はエラーをスローしません。


1
ありがとう!これは、テーブルまたはビューのリストでも機能します。DROP TABLE IF EXISTS 'table1', 'table2';DROP VIEW IF EXISTS 'view1', 'view2';PS-インラインコードに `s を含めるためにどの魔術を使用しましたか。
Campbeln 2016

2
@Campbelnコードセグメントの前後のバックティックを2倍にするだけです。その後、単一のバックティックがそのまま表示されます。
r3mainer

43

ただ使用するDROP TABLE IF EXISTS

DROP TABLE IF EXISTS `foo`;
CREATE TABLE `foo` ( ... );

その他の問題がある場合は、最初にMySQLドキュメントを検索してみてください。


8

ええと… 何年もの間、誰も微妙なことについて言及していませんでした。

かかわらずDROP TABLE IF EXISTS `bla`; CREATE TABLE `bla` ( ... );、いくつかのクライアントは、右のこの瞬間にアクセス対象テーブルに試すことがあります。古いテーブルがすでになくなって、新しいものがまだ作成されていない場合、合理的なようだ、それは状況につながります。

より良い方法は、新しいテーブルを作成して古いテーブルと交換することです(テーブルの内容は失われます):

CREATE TABLE `bla__new` (id int); /* if not ok: terminate, report error */
RENAME TABLE `bla__new` to `bla`; /* if ok: terminate, report success */
RENAME TABLE `bla` to `bla__old`, `bla__new` to `bla`;
DROP TABLE IF EXISTS `bla__old`;
  • エラーの場合は結果を確認し、CREATE ...続行しないでください。失敗とは、他のスレッドが同じスクリプトを完了しなかったことを意味します。これは、途中でクラッシュしたか、まだ完了していないためです。自分で検査してください。
  • 次に、最初の結果を確認し、成功した場合はRENAME ...続行しないでください。操作全体が正常に完了しています。さらに、別のスレッドがすでに同じシーケンスを開始している場合、次の実行は安全ではありません(今後もそうです)。RENAME ...
  • 2番目RENAME ...は、テーブル定義をアトミックに置き換えます 。詳細については、 MySQLのマニュアルを参照してください。
  • 最後にDROP ...、明らかに古いテーブルをクリーンアップします。

のようなものですべてのステートメントをラップSELECT GET_LOCK('__upgrade', -1); ... DO RELEASE_LOCK('__upgrade');すると、エラーチェックなしですべてのステートメントを順番に呼び出すことができますが、それは良い考えではないと思います。複雑さが増し、MySQLのロック関数はステートメントベースのレプリケーションには安全ではありません。

テーブルデータがテーブル定義のアップグレード後も存続する場合...一般的なケースでは、テーブル定義を比較して違いを見つけ、適切なALTER ...ステートメントを生成することははるかに複雑です。

サイド注1: あなたは同じアプローチを使用してビューを扱うことができ、この場合にはCREATE/DROP TABLE、単にに変換しCREATE/DROP VIEWながらRENAME TABLE遺跡変わりません。実際、テーブルをビューに変えることも、その逆も可能です。

CREATE VIEW `foo__new` as ...; /* if not ok: terminate, report error */
RENAME TABLE `foo__new` to `foo`; /* if ok: terminate, report success */
RENAME TABLE `foo` to `foo__old`, `foo__new` to `foo`;
DROP VIEW IF EXISTS `foo__old`;

補足2: MariaDBユーザーはに満足しているはずですCREATE OR REPLACE TABLE/VIEW。これはすでに問題を気にしていて、それは細かい点です。


1

テーブルを削除し、ビューのデータを使用して再作成する必要がありました。私はビューからテーブルを作成していましたが、これは私がやったことです:

DROP TABLE <table_name>;
CREATE TABLE <table_name> AS SELECT * FROM <view>;

上記は、MySQL MariaDbを使用して動作しました。


ドロップテーブルtable_name; ビューからselect *としてテーブルを作成します。
sirskoy

MariaDB(MySQLにはこれが欠けている)を使用している場合は、簡単にできますCREATE OR REPLACE <table_name> AS SELECT * FROM <view>;
Alex Offshore
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.