dbDelta-Unterstützung für FOREIGN KEY

9

Unter PHP 5.3.13 / MySQL 5.5.21 funktioniert der folgende Code nicht:

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);
 }

Der Code - Anbieter schlug eine Herabstufung auf MySQL 5.1.37 (nein, danke) oder das folgende Update:

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);
   }

Dies scheint eine ziemlich schmutzige Methode zu sein, um das Problem zu umgehen (keine kaskadierenden Löschungen / Aktualisierungen). Deshalb:

  1. Muss ich wirklich damit leben, bis dbDelta FOREIGN KEY unterstützt ?
  2. Stimmt es, dass dbDelta in einer 3 Jahre alten MySQL-Version nur mit Fremdschlüsseln funktioniert?
Gaia
quelle
1
Kaskadierende Löschungen / Aktualisierungen sind zwar nett, aber absolut notwendig? Können Sie diesen Teil in Ihren Code aufnehmen oder Ihre Tabellen umgestalten?
T0xicCode
Ich bin nicht sicher, ob sie notwendig sind. Ich habe diesen Code von Drittanbietern nicht genug studiert, um ihn zu kennen.
Gaia
1
TheDeadMedic ist korrekt. Ich habe jedoch gerade diesen Link dbDelta und FOREIGN KEY gefunden . Es erklärt einen Weg, um das Problem zu umgehen. Es hat bei mir funktioniert. Viel Glück!

Antworten:

3

Muss ich wirklich damit leben, bis dbDelta FOREIGN KEY unterstützt?

Ehrlich gesagt, ja. Aber das ist das Schöne an Open Source - jeder kann einen Patch posten!

Eine Erweiterung auf andere Aspekte des Schemadesigns würde jedoch mit ziemlicher Sicherheit zu unerwünschter Komplexität führen und die Wahrscheinlichkeit eines Ausfalls erhöhen - etwas, das das Kernteam im Voraus unbedingt in Betracht ziehen wird.

Ich würde den Rat von @ xav0989 befolgen - dbDeltafür seine Absicht verwenden (grundlegende Tabellenimplementierung, Spaltenergänzungen und -anpassungen) und die zusätzlichen Funktionen mit behandeln $wpdb.

TheDeadMedic
quelle