私はデータベースで作業しており、テーブルを複製しないためにdrop table TABLE if exists
ステートメントのいくつかの問題がありました。問題は、外部キーとインクルードの依存関係に基づいて、尊重すべき秩序があることです(どのテーブルを最初と2番目に削除しなければならないか)。すでに存在しない場合はテーブルを作成することができる他のステートメントがありますが、オーダーの問題なく同じ仕事をしているようです。 これらの2つの方法の違いがあるかどうかを知る必要があります。考慮すべき他の条件がありますか?テーブルが存在しない場合は作成し、テーブルを作成する前に存在する場合はテーブルを削除するという違いは何ですか?
答えて
一般に、db更新をリリースするときは、テーブルや他のオブジェクトを作成するためのステートメントを使用してSQLスクリプトを作成します。
ここからいくつかの戦略に従うことができます。 Mysqlは、更新プログラムを追加するスクリプトファイルを作成するという戦略もサポートしているようです。そのため、初めてスクリプトを実行するときにのみテーブルを作成します。次のすべての実行でテーブルは作成されません。もちろんこのシナリオでは、スクリプトファイルのすべてのオブジェクトに "if not exists
"句を追加する必要があります。
代わりに、オブジェクトごとに1つのファイルであるdbオブジェクトの数だけ複数のファイルを作成する方がより戦略に従います。オブジェクトがテーブルの場合は、最初にテーブルを作成してください。存在する場合はそれを削除します。と他のステートメントについて説明しました。
もちろん、このテーブルスクリプトファイルを実行すると、失われたままにしておきたいdbデータに注意を払います。また、ドロップ処理に影響する最終的な外部キー制約のために実行順序も注意してください。
一般的に、このスクリプトは、開発環境またはテスト環境でのみ、または本番環境で初めてデータベースをインストールするときに起動されます。
通常、prod envでは、dbテーブルオブジェクトを更新する限り、alter文だけを含むスクリプトを起動します。
はい、違いがあります。テーブルが存在する場合、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. mysqldump - 存在しない場合はテーブルを作成します。
- 2. スキーマビルダー:存在しない場合はテーブルを作成
- 3. テーブルが存在する場合はドロップテーブルを作成し、存在しない場合は作成してください。
- 4. 存在しない場合はINSERT、存在する場合は削除
- 5. Scalaqueryでテーブル/ビューの存在をテストします。存在しない場合は作成します。
- 6. テーブルが存在し、カラムが存在しない場合にのみテーブルが存在する場合のみ複数のデータベースのテーブルにカラムを追加する
- 7. HDF5グループ/テーブルが存在しない場合に作成します。
- 8. 存在する場合はファイルに追加し、存在しない場合は作成する
- 9. CloudFormation:リソースが存在しない場合は作成しますが、削除しない場合は
- 10. PHP mysqlデータベースが存在しない場合は作成する
- 11. フォルダが存在しない場合は作成する
- 12. テーブルを作成する方法データベースが存在しない場合は、PHPを使用してデータベースですか?
- 13. MYSQLテーブルがまだ存在しない場合、作成しようとするとエラーが発生する
- 14. GNUスクリーン接続が存在する場合、作成しない場合は
- 15. Powershellが存在しない場合にフォルダを作成する
- 16. テーブルが存在しない場合は長いクエリを実行
- 17. テーブルにレコードが存在しない場合に、Flashメッセージを生成する
- 18. 存在する場合はエンティティを削除し、Entity Frameworkに存在しない場合は追加します
- 19. テーブルが存在する場合にデータを挿入するか、テーブルを作成してデータを挿入する
- 20. 存在しない場合はエントリを作成します
- 21. LFTP - 存在しない場合はディレクトリを作成します。
- 22. テーブルにカラムを追加する(存在しない場合)
- 23. レコードが存在する場合はテーブルに結合する
- 24. ACCESS VBAコードが存在する場合にテーブルを削除するには
- 25. ファイルが存在しない場合にのみ作成する
- 26. DBインデックスが存在しない場合に作成する
- 27. EFコアデータベース行が存在しない場合に作成する
- 28. Rails ActiveRecordコールバック:存在する場合に更新する、存在しない場合に作成する
- 29. テーブルが存在しない場合にのみテーブルを作成するには、どうすれば休止状態にすることができますか?
- 30. 戻りNULL列はIDがテーブルに存在しない場合
「CREATE TABLE IF NOT EXISTS」は、テーブルにある可能性のあるデータを失うのを防ぎます。 – Uueerdo
違いはあなたの仕事を維持することです。 – Bohemian
この問題が発生する状況にある場合は、おそらくあなたのアプローチを考え直すべきです。 –