dbDelta รองรับ 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 จะรองรับคีย์ต่างประเทศ
  2. เป็นความจริงหรือไม่ที่ dbDelta ใช้งานกับคีย์ต่างประเทศในรุ่น MySQL อายุ 3 ปีเท่านั้น?

1
ในขณะที่การลบเรียง / ลบการปรับปรุงเป็นสิ่งที่ดีพวกเขามีความจำเป็นอย่างสิ้นเชิง? คุณสามารถรวมส่วนนั้นในรหัสของคุณหรือ refactor ตารางของคุณ?
T0xicCode

ฉันไม่แน่ใจว่าพวกเขาจำเป็นหรือไม่ฉันยังไม่ได้ศึกษารหัสบุคคลที่สามนี้พอที่จะรู้
Gaia

1
กระบวนการ DeadMedic ถูกต้อง อย่างไรก็ตามฉันเพิ่งพบLink dbDelta และ KEY ต่างประเทศนี้ มันอธิบายวิธีแก้ไขปัญหา มันใช้งานได้สำหรับฉัน โชคดี!

คำตอบ:


3

ฉันต้องใช้ชีวิตแบบนั้นจริงๆหรือไม่จนกว่า dbDelta จะรองรับคีย์ต่างประเทศ?

ค่อนข้างตรงไปตรงมาใช่ แต่นั่นคือความงามของโอเพนซอร์ส - ทุกคนยินดีที่จะโพสต์แพทช์!

อย่างไรก็ตามการขยายเพื่อให้ครอบคลุมด้านอื่น ๆ ของการออกแบบสคีมาจะทำให้เกิดความซับซ้อนที่ไม่พึงประสงค์และเพิ่มความเป็นไปได้ของความล้มเหลวซึ่งเป็นสิ่งที่ทีมงานหลักจะต้องพิจารณาอย่างรอบคอบก่อน

ฉันจะใช้เวลา @ คำแนะนำ xav0989 ของ - ใช้dbDeltaสำหรับมันความตั้งใจ (การดำเนินงานตารางพื้นฐานเพิ่มเติมคอลัมน์และปรับเปลี่ยน) $wpdbและจัดการกับคุณลักษณะเพิ่มเติมด้วย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.