0

プロシージャを使用せずに、MySQL で任意の種類のロジックを使用することは可能ですか? 私の Web ホスティングでは手順を作成できないため、回避策を探しています。

私がやりたいことのタイプは、テーブルがまだ存在しない場合にのみアイテムをテーブルに追加することです。または、列がまだ存在しない場合は、テーブルに列を追加します。などの操作ができますがCREATE TABLE IF NOT EXISTS、私が必要とするいくつかの操作にはそのような贅沢はありません:(

素敵な proc が機能しないことに後になって気付いたので、トップレベルのクエリとして IF/ELSE ロジックを記述しようとしましたが、MySQL の場合、IF ELSE ブロックは関数/proc 内でのみ機能し、グローバル スコープでは機能しないようです。

回避策は非常に受け取りました-ホスティングに手順を作成する権限を付与するように既に依頼しましたが、まだ返信がありません...

4

4 に答える 4

1

どちらにもアクセスできないと思いますINFORMATION_SCHEMA。おそらく解決策を見つけることができますが、私の意見では、次のことをお勧めします。

ホスティング プロバイダーを変更します。真剣に。必要に応じて追加料金を支払うことで、必要に応じて構成できる MySQL インスタンスを購入できます。プロシージャと関数の作成が許可されていない場合、DBMS が機能しなくなるだけです。


特定のタスクで考えられる回避策: 列が存在しない場合は追加します。

1)ALTER TABLE列を追加するだけです。既に存在する場合は、エラーが発生します。アプリケーションでそのエラーをキャッチできます。

2) (にアクセスできない場合INFORMATION_SCHEMA) データベースのスキーマのバージョンを維持します。

于 2012-06-22T21:04:04.603 に答える
0

私が考えることができる最善の解決策は、SQLで追加の言語を使用することです。たとえば、特定のレコードに対してクエリを実行し、取得した応答に基づいて、条件付きでINSERTステートメントを実行できます。

テーブルが存在しない場合に挿入するには、SHOW TABLESステートメントを使用して、結果セットに名前が存在するかどうかをテストしてみてください。

于 2012-06-22T20:55:30.327 に答える
0

MySQL がサポートしていますINSERT IGNORE。とINSERT ... ON DUPLICATE KEY UPDATE

以下は、新しい行を挿入しますが、既存の行がない場合のみですid=10id(これは、が一意または主キーとして定義されていることを前提としています)。

INSERT IGNORE INTO my_table (id, col1, col2) values (10, "abc", "def");

以下は新しい行を挿入しますが、既存の行がある場合id=10(ここでも id が一意またはプライマリであると仮定します)、既存の行は新しい行を挿入する代わりに、新しい値を保持するように更新されます。

INSERT INTO my_table (id, col1, col2) values (10, "abc", "def")
   ON DUPLICATE KEY UPDATE col1=VALUES(col1), col2=VALUES(col2)

また、修飾子をCREATE TABLEサポートします。IF NOT EXISTSしたがって、次のようなことができます:

CREATE TABLE IF NOT EXISTS my_table ...

MySQL には他にも多くの同様のオプションと修飾子があります。詳細については、ドキュメントを確認してください。

于 2012-06-22T21:08:05.007 に答える
0

最初に、データベース スキーマを作成または更新するための大きなスクリプトを作成しました。これは、ローカル マシンからサーバーにデータベースの変更を簡単にデプロイできるようにするためです。
私のスクリプトは、「テーブル 'abc' が存在し、'blah' という FK 制約がない場合」という処理を何度も実行してから、テーブル 'abc' に 'blah' という FK 制約を作成します... など。

テーブルに特定の列や制約などがあるかどうかを実際に確認する必要がないことに気付きました。これは、スキーマのバージョン管理システムを維持し、アプリの起動時または特定の場所に移動したときに DB スキーマ バージョンを照会できるためです。ページ。

たとえば、テーブルに新しい列を追加したいとしましょう。それはこのように動作します:

  • 列を既存のテーブルに追加するために必要な SQL を含む新しい移行スクリプトをアプリ コードに追加します。
  • アプリのスキーマ バージョンを 1 増やします
  • アプリの起動時に、アプリは DB のスキーマ バージョンについて DB にクエリを実行します。
  • DB スキーマ バージョン < アプリ スキーマ バージョンの場合、2 つのスキーマ バージョン間で SQL 移行スクリプトを実行し、DB スキーマ バージョンをアプリと同じになるように更新します。

たとえば、DB のスキーマ バージョンが 5 で、アプリのバージョンが 8 の場合、アプリは移行スクリプト 5-6、6-7、および 7-8 を DB に適用します。これらは、DB 側で何もチェックすることなく実行できます。

したがって、アプリは DB スキーマの更新を単独で担当し、ローカルまたはリモート DB でスキーマ変更スクリプトを実行する必要はありません。

質問のために実装しようとしていたシステムよりも優れたシステムだと思います。

于 2012-06-23T09:46:13.277 に答える