W PHP 5.3.13 / MySQL 5.5.21 następujący kod nie działa:
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);
}
Dostawca kod zaproponował downgrade do MySQL 5.1.37 (nie, dziękuję) lub po aktualizacji:
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);
}
Co wydaje się dość brudnym sposobem obejścia problemu (brak kaskadowego usuwania / aktualizacji). W związku z tym:
- Czy naprawdę muszę z tym żyć, dopóki dbDelta nie będzie obsługiwać klucza OBCEGO ?
- Czy to prawda, że dbDelta działa tylko z kluczem obcym w 3-letniej wersji MySQL?
Odpowiedzi:
Szczerze mówiąc tak. Ale to piękno Open Source - każdy może opublikować łatkę!
Jednak rozszerzenie go na inne aspekty projektowania schematu prawie na pewno spowodowałoby niepożądaną złożoność i zwiększyłoby możliwość niepowodzenia - coś, co zespół główny zdecydowanie wcześniej rozważy.
Skorzystałbym z porady @ xav0989 - używaj
dbDelta
jej zgodnie z jej intencją (podstawowa implementacja tabeli, dodawanie i korekty kolumn) i obsługuj dodatkowe funkcje za pomocą$wpdb
.źródło