Soporte de dbDelta para CLAVE EXTRANJERA

9

En PHP 5.3.13 / MySQL 5.5.21, el siguiente código no funciona:

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

El proveedor de código sugirió una versión anterior a MySQL 5.1.37 (no, gracias) o la siguiente actualización:

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

Lo que parece una forma bastante sucia de solucionar el problema (sin eliminaciones / actualizaciones en cascada). Por lo tanto:

  1. ¿Realmente tengo que vivir con eso hasta que dbDelta sea compatible con FOREIGN KEY ?
  2. ¿Es cierto que dbDelta solo funciona con clave externa en una versión MySQL de 3 años?
Gaia
fuente
1
Si bien las eliminaciones / actualizaciones en cascada son agradables, ¿son totalmente necesarias? ¿Puede incluir esa parte en su código o refactorizar sus tablas?
T0xicCode
No estoy seguro de si son necesarios, no he estudiado este código de terceros lo suficiente como para saberlo.
Gaia
1
TheDeadMedic es correcto. Sin embargo, acabo de encontrar este enlace dbDelta y FOREIGN KEY . Explica una forma de evitar el problema. Funcionó para mi. ¡Buena suerte!

Respuestas:

3

¿Realmente tengo que vivir con eso hasta que dbDelta sea compatible con FOREIGN KEY?

Francamente, sí. Pero esa es la belleza del código abierto: ¡cualquiera puede publicar un parche!

Sin embargo , expandirlo para cubrir otros aspectos del diseño de esquemas casi con seguridad incurriría en una complejidad no deseada y aumentaría la posibilidad de falla, algo que el equipo central considerará de antemano.

Tomaría el consejo de @ xav0989: úselo dbDeltapara su propósito (implementación de tabla básica, adiciones y ajustes de columna), y maneje las características adicionales con $wpdb.

TheDeadMedic
fuente