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.