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.