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:
- Eu realmente tenho que conviver com isso até o dbDelta suportar a FOREIGN KEY ?
- É verdade que o dbDelta só funciona com chave estrangeira em uma versão MySQL de 3 anos?
Respostas:
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
dbDelta
para sua intenção (implementação básica de tabela, adições e ajustes de coluna) e lide com os recursos adicionais$wpdb
.fonte