web-dev-qa-db-ja.com

FOREIGN KEYに対するdbDeltaのサポート

PHP 5.3.13/MySQL 5.5.21では、次のコードは機能しません。

if($check_custom_fields_form!=1){
    $sql = "CREATE TABLE IF NOT EXISTS ". $table_custom_fields_form ." (
                `form_name` longtext NOT NULL,
                `field_id` bigint(20) NOT NULL,
                FOREIGN KEY (`field_id`) REFERENCES $table_custom_fields (`ID`) ON DELETE CASCADE ON UPDATE CASCADE
    ) CHARACTER SET utf8 COLLATE utf8_general_ci";
    dbDelta($sql);
}
if($check_subscribe_cat!=1){
    $sql = "CREATE TABLE IF NOT EXISTS ". $table_subscribe_cat ." (
                `subscribe_id` bigint(20) NOT NULL,
                `cat_id` bigint(20) NOT NULL,
                FOREIGN KEY (`subscribe_id`) REFERENCES ".$wpdb->prefix."tgt_subscription (`ID`) ON DELETE CASCADE ON UPDATE CASCADE,
                FOREIGN KEY (`cat_id`) REFERENCES ".$wpdb->prefix."terms (`term_id`) ON DELETE CASCADE ON UPDATE CASCADE
    ) CHARACTER SET utf8 COLLATE utf8_general_ci";
    dbDelta($sql);
 }

コードプロバイダ MySQL 5.1.37へのダウングレードを提案しました(いいえ、ありがとう)、または以下の更新を行います。

if($check_custom_fields_form!=1){
        $sql = "CREATE TABLE IF NOT EXISTS ". $table_custom_fields_form ." (
                    `form_name` longtext NOT NULL,
                    `field_id` bigint(20) NOT NULL,
                    KEY(field_id)
        ) CHARACTER SET utf8 COLLATE utf8_general_ci";
        dbDelta($sql);
    }
if($check_subscribe_cat!=1){
      $sql = "CREATE TABLE IF NOT EXISTS ". $table_subscribe_cat ." (
                  `subscribe_id` bigint(20) NOT NULL,
                  `cat_id` bigint(20) NOT NULL,
                  KEY(subscribe_id),
                  KEY(cat_id)
      ) CHARACTER SET utf8 COLLATE utf8_general_ci";
      dbDelta($sql);
   }

これは、問題を回避するためのかなり厄介な方法のようです(連鎖削除/更新はありません)。したがって:

  1. 私は本当にそれで生きなければなりません dbDeltaが外部キーをサポートするまで
  2. dbDeltaが3年前のMySQLバージョンの外部キーでしか動作しないというのは本当ですか?
8
Gaia

DbDeltaがFOREIGN KEYをサポートするまで、私は本当にそれで生きなければなりませんか?

率直に言って、はい。しかし、それがオープンソースの美しさです - 誰でもパッチを投稿することを歓迎します!

しかし 、スキーマ設計の他の側面をカバーするためにそれを拡張することは、ほぼ確実に望ましくない複雑さを招き、失敗の可能性を高めます - コアチームが事前に強く考慮する何か。

私は@ xav0989のアドバイスを受けます - その意図(基本的なテーブルの実装、カラムの追加と調整)のためにdbDeltaを使用し、$wpdbで追加機能を処理します。

3
TheDeadMedic