web-dev-qa-db-ja.com

dbDelta ALTER TABLEの構文

DBが変更されたため、テーブルを1列追加するためにテーブルを変更する必要がありますが、関数が実行されていてもテーブルは変更されません。これが私が書いたALTER TABLEコードです。

$sql = "ALTER TABLE " . $packagetable . " ADD COLUMN price decimal(14,2) NOT NULL AFTER description;";
dbDelta($sql);

私はどこでもオンラインでdbDeltaとALTER TABLEの構文を見つけることができませんでした。編集:重力フォームプラグインでALTER TABLEステートメントを見た後、私は一行でステートメントを更新しました。

2
mehulved

dbDelta関数の使い方が間違っています。

その機能の要点は、テーブル作成SQLコマンドを渡すことです。

テーブルが存在しない場合は作成します。

テーブルは存在するが一致しない場合 、一致するまで修正されます。これには、列、インデックス、その他の側面の追加と更新が含まれます。

ですから、あなたがしたいことはdbDeltaを実行して、それをあなたのtable creation sqlではなくtable modification sqlで提供することです。

dbDeltaを使用してテーブルにアップグレード/変更を追加する上でのCodexの見方については、こちらを参照してください

しかし、それはさらに進んでいます! dbDeltaはうるさい関数です。そこにSQLステートメントを入れることはできません。適切にフォーマットする必要があります。

これは、コーデックスが同じページに書いていることです。

  1. SQLステートメントでは、各フィールドをそれぞれ独自の行に入れる必要があります。
  2. PRIMARY KEYと主キーの定義の間には2つのスペースが必要です。
  3. 同義語のINDEXではなく、キーワードKEYを使用し、少なくとも1つのKEYを含める必要があります。
  4. フィールド名をアポストロフィやバッククォートで囲まないでください。

そして別のものから:

dbDelta関数

私の記事の1つで前述したように、dbDelta関数には現在のテーブル構造を調べ、それを目的のテーブル構造と比較し、必要に応じてテーブルを追加または変更する機能があります。プラグインしかし、多くのWordPress関数とは異なり、dbDelta関数は最もうるさいと面倒なものです。 dbDelta関数が機能するためには、いくつかの基準が満たされる必要があります。

  1. SQLステートメントでは、各フィールドをそれぞれ独自の行に配置する必要があります。
  2. PRIMARY KEYと主キーの定義の間には2つのスペースが必要です。
  3. 同義語のINDEXではなく、キーワードKEYを使用し、少なくとも1つのKEYを含める必要があります。

まあ、上記の基準は簡単に達成できます。しかしそれがあなたにぶつかるまで待ってください。

11
Tom J Nowell