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?

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.