FOREIGN KEYのdbDeltaサポート


9

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がFOREIGN KEYをサポートするまで、私は実際にこれに耐えなければなりませんか?
  2. dbDeltaが3年前のMySQLバージョンの外部キーでのみ機能するのは本当ですか?

1
カスケード削除/更新は便利ですが、完全に必要ですか?その部分をコードに含めたり、テーブルをリファクタリングしたりできますか?
T0xicCode

それらが必要かどうかはわかりませんが、このサードパーティのコードを十分に理解していないためです。
ガイア

1
TheDeadMedicは正しいです。しかし、私はこのLink dbDeltaとFOREIGN KEYを見つけました。問題を回避する方法を説明します。それは私のために働いた。幸運を!

回答:


3

dbDeltaがFOREIGN KEYをサポートするまで、私は本当にこれに耐えなければなりませんか?

率直に言って、はい。しかし、それがオープンソースの美点です。誰でもパッチを投稿できます。

ただし、スキーマ設計の他の側面をカバーするように拡張すると、ほぼ確実に不要な複雑性が発生し、失敗の可能性が高まります。これは、コアチームが事前に強く検討することです。

私は@ xav0989のアドバイスを取り入れます- dbDeltaその意図(基本的なテーブルの実装、列の追加と調整)を使用し、で追加機能を処理します$wpdb

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.