Unter PHP 5.3.13 / MySQL 5.5.21 funktioniert der folgende Code nicht:
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);
}
Der Code - Anbieter schlug eine Herabstufung auf MySQL 5.1.37 (nein, danke) oder das folgende Update:
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);
}
Dies scheint eine ziemlich schmutzige Methode zu sein, um das Problem zu umgehen (keine kaskadierenden Löschungen / Aktualisierungen). Deshalb:
- Muss ich wirklich damit leben, bis dbDelta FOREIGN KEY unterstützt ?
- Stimmt es, dass dbDelta in einer 3 Jahre alten MySQL-Version nur mit Fremdschlüsseln funktioniert?
Antworten:
Ehrlich gesagt, ja. Aber das ist das Schöne an Open Source - jeder kann einen Patch posten!
Eine Erweiterung auf andere Aspekte des Schemadesigns würde jedoch mit ziemlicher Sicherheit zu unerwünschter Komplexität führen und die Wahrscheinlichkeit eines Ausfalls erhöhen - etwas, das das Kernteam im Voraus unbedingt in Betracht ziehen wird.
Ich würde den Rat von @ xav0989 befolgen -
dbDelta
für seine Absicht verwenden (grundlegende Tabellenimplementierung, Spaltenergänzungen und -anpassungen) und die zusätzlichen Funktionen mit behandeln$wpdb
.quelle