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?

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.