Suporte dbDelta para KEY ESTRANGEIRO

9

No PHP 5.3.13 / MySQL 5.5.21, o seguinte código não 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);
 }

O provedor de código sugeriu um downgrade para o MySQL 5.1.37 (não, obrigado) ou a seguinte atualização:

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

O que parece ser uma maneira bastante suja de solucionar o problema (sem exclusões / atualizações em cascata). Portanto:

  1. Eu realmente tenho que conviver com isso até o dbDelta suportar a FOREIGN KEY ?
  2. É verdade que o dbDelta só funciona com chave estrangeira em uma versão MySQL de 3 anos?
Gaia
fonte
11
Embora as exclusões / atualizações em cascata sejam boas, elas são totalmente necessárias? Você pode incluir essa parte no seu código ou refatorar suas tabelas?
T0xicCode
Não tenho certeza se eles são necessários, não estudei esse código de terceiros o suficiente para saber.
Gaia
11
TheDeadMedic está correto. No entanto, acabei de encontrar este link dbDelta e FOREIGN KEY . Explica uma maneira de contornar o problema. Funcionou para mim. Boa sorte!

Respostas:

3

Eu realmente tenho que conviver com isso até o dbDelta suportar a FOREIGN KEY?

Francamente, sim. Mas essa é a beleza do código aberto - qualquer um pode publicar um patch!

No entanto , expandi-lo para abranger outros aspectos do design do esquema quase certamente incorreria em complexidade indesejada e aumentaria a possibilidade de falha - algo que a equipe principal considerará fortemente com antecedência.

Gostaria de seguir o conselho de @ xav0989 - use dbDeltapara sua intenção (implementação básica de tabela, adições e ajustes de coluna) e lide com os recursos adicionais $wpdb.

TheDeadMedic
fonte