dbDelta对FOREIGN KEY的支持


9

在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);
   }

解决问题的方法似乎很肮脏(没有级联的删除/更新)。因此:

  1. dbDelta支持FOREIGN KEY之前,我真的必须忍受吗?
  2. dbDelta是否仅在使用3年的MySQL版本中可以与外键一起使用吗?

1
级联的删除/更新很好,但是它们是否完全必要?您可以在代码中包含该部分,还是可以重构表?
T0xicCode 2012年

我不确定它们是否必要,我还没有研究过这个第三方代码。
盖亚2012年

1
TheDeadMedic是正确的。但是,我只是找到了此链接dbDelta和FOREIGN KEY。它解释了解决该问题的方法。它为我工作。祝好运!

Answers:


3

在dbDelta支持FOREIGN KEY之前,我真的必须忍受吗?

坦率地说,是的。但这就是开源的魅力-欢迎任何人发布补丁!

但是,将其扩展到涵盖架构设计的其他方面几乎可以肯定会导致不必要的复杂性并增加失败的可能性-核心团队会事先考虑这一点。

我会接受@ xav0989的建议- dbDelta用于其用途(基本表实现,列添加和调整),并使用来处理其他功能$wpdb

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.