В PHP 5.3.13 / MySQL 5.5.21 следующий код не работает:
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);
}
Провайдер код предложил понизить в MySQL 5.1.37 (нет, спасибо) или следующее обновление:
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);
}
Что кажется довольно грязным способом решения проблемы (без каскадного удаления / обновления). Следовательно:
- Должен ли я жить с этим, пока dbDelta не поддерживает FOREIGN KEY ?
- Правда ли, что dbDelta работает только с внешним ключом в 3-летней версии MySQL?
Ответы:
Откровенно говоря, да. Но в этом прелесть открытого исходного кода - любой желающий может выложить патч!
Однако расширение его для охвата других аспектов проектирования схемы почти наверняка повлечет за собой нежелательную сложность и увеличит вероятность отказа - что-то, что основная группа решит заранее.
Я бы воспользовался советом @xav0989 - используйте
dbDelta
его по назначению (базовая реализация таблиц, добавление и корректировка столбцов) и воспользуйтесь дополнительными функциями$wpdb
.источник