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 suggère un déclassement 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 une manière plutôt sale de contourner le problème (pas de suppression/mise à jour en cascade). Donc:
Dois-je vraiment vivre avec cela jusqu'à ce que dbDelta prenne en charge FOREIGN KEY?
Très franchement, oui. Mais c’est la beauté de l’open source: tout le monde est invité à poster un patch!
Cependant , l’élargir à d’autres aspects de la conception des schémas engendrerait presque certainement une complexité non désirée et augmenterait les risques d’échec - ce que l’équipe centrale va sérieusement envisager à l’avance.
Je suivrais le conseil de @ xav0989 - utilisez dbDelta
pour son intention (implémentation de table de base, ajouts et ajustements de colonnes) et gérez les fonctionnalités supplémentaires avec $wpdb
.