Prise en charge de dbDelta pour FOREIGN KEY


9

Sur PHP 5.3.13 / MySQL 5.5.21, le code suivant ne fonctionne pas:

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

Le fournisseur de code a suggéré une mise à niveau inférieure vers MySQL 5.1.37 (non, merci) ou la mise à jour suivante:

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

Ce qui semble être un moyen plutôt sale de contourner le problème (pas de suppressions / mises à jour en cascade). Donc:

  1. Dois-je vraiment vivre avec ça jusqu'à ce que dbDelta prenne en charge FOREIGN KEY ?
  2. Est-il vrai que dbDelta ne fonctionne qu'avec une clé étrangère dans une version MySQL vieille de 3 ans?

1
Bien que les suppressions / mises à jour en cascade soient agréables, sont-elles totalement nécessaires? Pouvez-vous inclure cette partie dans votre code ou refaçonner vos tables?
T0xicCode

Je ne sais pas s'ils sont nécessaires, je n'ai pas suffisamment étudié ce code tiers pour le savoir.
Gaia

1
TheDeadMedic est correct. Cependant, je viens de trouver ce lien dbDelta et FOREIGN KEY . Il explique un moyen de contourner le problème. Ça a marché pour moi. Bonne chance!

Réponses:


3

Dois-je vraiment vivre avec ça jusqu'à ce que dbDelta prenne en charge FOREIGN KEY?

Franchement, oui. Mais c'est la beauté de l'open source - n'importe qui est le bienvenu pour poster un patch!

Cependant , son extension pour couvrir d'autres aspects de la conception de schéma entraînerait presque certainement une complexité indésirable et augmenterait les risques d'échec - ce que l'équipe principale considérera fortement à l'avance.

Je prendrais les conseils de @ xav0989 - utilisez dbDeltapour son intention (implémentation de table de base, ajouts et ajustements de colonnes), et gérer les fonctionnalités supplémentaires avec $wpdb.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.