FORBIGN KEY के लिए dbDelta सपोर्ट


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

मुझे यकीन नहीं है कि क्या वे आवश्यक हैं, मैंने यह जानने के लिए इस 3 पार्टी कोड का पर्याप्त अध्ययन नहीं किया है।
— Gaia

1
TheDeadMedic सही है। हालाँकि, मुझे यह लिंक dbDelta और FOREIGN KEY मिला । यह समस्या का एक तरीका बताता है। इसने मेरे लिए काम किया। सौभाग्य!

जवाबों:


3

क्या मुझे वास्तव में उस समय तक रहना है जब तक dbDelta FOREIGN KEY का समर्थन नहीं करता है?

काफी खुलकर, हाँ। लेकिन यह खुला स्रोत की सुंदरता है - किसी को भी एक पोस्ट पोस्ट करने के लिए स्वागत है!

हालांकि , स्कीमा डिज़ाइन के अन्य पहलुओं को कवर करने के लिए इसका विस्तार करने से निश्चित रूप से अवांछित जटिलता पैदा होगी और विफलता की संभावना बढ़ जाएगी - कोर टीम पहले से दृढ़ता से विचार करेगी।

मैं @ xav0989 की सलाह लूंगा - dbDeltaइसके इरादे (मूल तालिका कार्यान्वयन, स्तंभ जोड़ और समायोजन) के लिए उपयोग करें, और अतिरिक्त सुविधाओं को संभालें $wpdb।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.