私は困惑している、これをどうやってやるのかわからない。
基本的にはテーブルを作成したいだけですが、存在する場合は削除して再作成する必要があります。切り捨ては行われませんが、存在しない場合は作成してください。
誰かが助けることができますか?
ありがとう、ジョージ
διαγραφή πίνακα, εφόσον υπάρχει。
私は困惑している、これをどうやってやるのかわからない。
基本的にはテーブルを作成したいだけですが、存在する場合は削除して再作成する必要があります。切り捨ては行われませんが、存在しない場合は作成してください。
誰かが助けることができますか?
ありがとう、ジョージ
διαγραφή πίνακα, εφόσον υπάρχει。
回答:
ちょうどDROP TABLE IF EXISTS `tablename`;あなたのCREATE TABLE声明の前に置きます。
そのステートメントはテーブルが存在する場合は削除しますが、存在しない場合はエラーをスローしません。
DROP TABLE IF EXISTS 'table1', 'table2';とDROP VIEW IF EXISTS 'view1', 'view2';PS-インラインコードに `s を含めるためにどの魔術を使用しましたか。
ただ使用するDROP TABLE IF EXISTS:
DROP TABLE IF EXISTS `foo`;
CREATE TABLE `foo` ( ... );
その他の問題がある場合は、最初にMySQLドキュメントを検索してみてください。
ええと… 何年もの間、誰も微妙なことについて言及していませんでした。
かかわらず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 ...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。これはすでに問題を気にしていて、それは細かい点です。
テーブルを削除し、ビューのデータを使用して再作成する必要がありました。私はビューからテーブルを作成していましたが、これは私がやったことです:
DROP TABLE <table_name>;
CREATE TABLE <table_name> AS SELECT * FROM <view>;
上記は、MySQL MariaDbを使用して動作しました。
CREATE OR REPLACE <table_name> AS SELECT * FROM <view>;