问题描述
在 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);
}
code provider 建议降级为 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);
}
这似乎是一个相当脏的方式来解决问题 (没有级联删除/更新) 。因此:
-
我真的要和那个 until dbDelta supports FOREIGN KEY 一起生活吗?
-
dbDelta 是否只能在 3 年的 MySQL 版本中使用外键?
最佳解决方案
Do I really have to live with that until dbDelta supports FOREIGN KEY?
坦白说,是的。但这是开源的美丽 – 任何人都欢迎发贴!
然而,扩展它以涵盖模式设计的其他方面几乎肯定会引起不必要的复杂性提高失败的可能性 – 核心团队将事先强烈考虑。
我会采取 @ xav0989 的建议 – 使用 dbDelta
的意图 (基本表实现,列添加和调整),并使用 $wpdb
处理附加功能。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。