2016-12-29 2 views
1

私はデータベースで作業しており、テーブルを複製しないためにdrop table TABLE if existsステートメントのいくつかの問題がありました。問題は、外部キーとインクルードの依存関係に基づいて、尊重すべき秩序があることです(どのテーブルを最初と2番目に削除しなければならないか)。すでに存在しない場合はテーブルを作成することができる他のステートメントがありますが、オーダーの問題なく同じ仕事をしているようです。 これらの2つの方法の違いがあるかどうかを知る必要があります。考慮すべき他の条件がありますか?テーブルが存在しない場合は作成し、テーブルを作成する前に存在する場合はテーブルを削除するという違いは何ですか?

+3

「CREATE TABLE IF NOT EXISTS」は、テーブルにある可能性のあるデータを失うのを防ぎます。 – Uueerdo

+1

違いはあなたの仕事を維持することです。 – Bohemian

+0

この問題が発生する状況にある場合は、おそらくあなたのアプローチを考え直すべきです。 –

答えて

0

一般に、db更新をリリースするときは、テーブルや他のオブジェクトを作成するためのステートメントを使用してSQLスクリプトを作成します。

ここからいくつかの戦略に従うことができます。 Mysqlは、更新プログラムを追加するスクリプトファイルを作成するという戦略もサポートしているようです。そのため、初めてスクリプトを実行するときにのみテーブルを作成します。次のすべての実行でテーブルは作成されません。もちろんこのシナリオでは、スクリプトファイルのすべてのオブジェクトに "if not exists"句を追加する必要があります。

代わりに、オブジェクトごとに1つのファイルであるdbオブジェクトの数だけ複数のファイルを作成する方がより戦略に従います。オブジェクトがテーブルの場合は、最初にテーブルを作成してください。存在する場合はそれを削除します。と他のステートメントについて説明しました。

もちろん、このテーブルスクリプトファイルを実行すると、失われたままにしておきたいdbデータに注意を払います。また、ドロップ処理に影響する最終的な外部キー制約のために実行順序も注意してください。

一般的に、このスクリプトは、開発環境またはテスト環境でのみ、または本番環境で初めてデータベースをインストールするときに起動されます。

通常、prod envでは、dbテーブルオブジェクトを更新する限り、alter文だけを含むスクリプトを起動します。

2

はい、違いがあります。テーブルが存在する場合、CREATE TABLE IF NOT EXISTSになりません。なので、競合は発生しません。

テーブルが存在する場合、DROP TABLE IF EXISTSはテーブルを削除し、テーブルが必要な場合は競合を引き起こします。

さらに、他の人が言ったように: - 許可がリセットされます(これは意図的な場合はプラスかもしれませんが、許可が復元される必要がある場合の欠点かもしれません)。 - テーブルを削除すると、すべてのデータが失われます。 - 表を含むビュー、プロシージャー、関数、索引は、再サブミットする必要があります。

これらの理由から、あなたはおそらくDROP TABLEを使用しないことをお勧めします。

テーブルを既知の状態にリセットする場合、これはのデータベースの臭いです。つまり、データベースの変更を追跡する際に問題があることを意味します。この問題を回避するのではなく、データベースが制御不能になる理由を理解することに時間を投資する方がよい(ALTER TABLEまたはCREATE INDEXを使用して変更を行う必要があり、1つずつ取り消し可能にする必要があります。)。それを支配下に戻す方法。将来的には大きな恩恵をもたらすでしょう。

SET FOREIGN_KEY_CHECKS = 0でも可能です。 hereを参照してください。


ご変更はあなたがVARCHAR(15)VARCHAR(30)を変更する例えば、データの損失につながる場合(1)、あなただけの主キーと影響を受けたフィールドを選択することにより、アンドゥテーブルを作成することができます - CREATE TABLE undo_20161229_183415 AS SELECT tbl.pkey, tbl.changedfield1, tbl.changedfield2古い値と変更する前に。その後、フィールド定義を元に戻して、表のUPDATE JOINを実行することができます。

NOTE:あなたは最初は新しい形式に古い値をキャストするためにWHEREを追加し、これは新しいテーブルにあるものと一致することを確認することもできます。

2016-12-29.1 1234 PEOPLE'S REPUBLIC OF CHINA 
2016-12-29.2 1234 PEOPLE'S REPUBLI # the change was ill advised 
2017-01-15  1234 TAIWAN    # the customer moved 

2月2日にあなたあなたのデータを元に戻して回復したい場合は、PEOPLE'S REPUBLIをPRCのフルネーム... に置き換えます。を除き、そのレコードでPRCを現在のTAIWANに復元したくないということです。

1

これをドロップして作成すると、当然ながら、すべてのアクセス許可がテーブルにリセットされ、このテーブルを使用するクエリの実行計画がリセットされます。このテーブルを使用するすべてのプロシージャ/ファンクションも無効になります。

関連する問題