dbDelta supporto per FOREIGN KEY


9

Su PHP 5.3.13 / MySQL 5.5.21 il seguente codice non funziona:

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

Il fornitore del codice ha suggerito un downgrade a MySQL 5.1.37 (no, grazie) o il seguente aggiornamento:

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

Che sembra un modo piuttosto sporco per aggirare il problema (nessuna eliminazione / aggiornamento a cascata). Perciò:

  1. Devo davvero conviverci fino a quando dbDelta non supporta FOREIGN KEY ?
  2. È vero che dbDelta funziona solo con chiave esterna in una versione MySQL di 3 anni?

1
Mentre le eliminazioni / gli aggiornamenti a cascata sono utili, sono assolutamente necessari? Puoi includere quella parte nel tuo codice o rifattorizzare le tue tabelle?
T0xic,

Non sono sicuro che siano necessari, non ho studiato questo codice di terze parti abbastanza per saperlo.
Gaia,

1
TheDeadMedic è corretto. Tuttavia, ho appena trovato questo collegamento dbDelta e FOREIGN KEY . Spiega come aggirare il problema. Ha funzionato per me. In bocca al lupo!

Risposte:


3

Devo davvero conviverci fino a quando dbDelta non supporta FOREIGN KEY?

Francamente, sì. Ma questa è la bellezza dell'open source: chiunque è invitato a pubblicare una patch!

Tuttavia , espanderlo per coprire altri aspetti della progettazione dello schema comporterebbe quasi certamente una complessità indesiderata e aumenterebbe la possibilità di fallimento - qualcosa che il team centrale considererà fortemente in anticipo.

Vorrei seguire i consigli di @ xav0989: utilizzarlo dbDeltaper le sue intenzioni (implementazione di base della tabella, aggiunte e regolazioni delle colonne) e gestire le funzionalità aggiuntive con $wpdb.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.