Obsługa dbDelta dla klucza zagranicznego

9

W PHP 5.3.13 / MySQL 5.5.21 następujący kod nie działa:

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

Dostawca kod zaproponował downgrade do MySQL 5.1.37 (nie, dziękuję) lub po aktualizacji:

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

Co wydaje się dość brudnym sposobem obejścia problemu (brak kaskadowego usuwania / aktualizacji). W związku z tym:

  1. Czy naprawdę muszę z tym żyć, dopóki dbDelta nie będzie obsługiwać klucza OBCEGO ?
  2. Czy to prawda, że ​​dbDelta działa tylko z kluczem obcym w 3-letniej wersji MySQL?
Gaia
źródło
1
Chociaż kaskadowe usuwanie / aktualizacje są dobre, czy są one całkowicie konieczne? Czy możesz dołączyć tę część do swojego kodu lub zmienić tabele?
T0xicCode
Nie jestem pewien, czy są one konieczne, nie studiowałem tego kodu innej firmy, aby wiedzieć.
Gaia,
1
TheDeadMedic jest poprawny. Jednak właśnie znalazłem ten link dbDelta i KLUCZ ZAGRANICZNY . Wyjaśnia sposób rozwiązania problemu. To zadziałało dla mnie. Powodzenia!

Odpowiedzi:

3

Czy naprawdę muszę z tym żyć, dopóki dbDelta nie będzie obsługiwać klucza OBCEGO?

Szczerze mówiąc tak. Ale to piękno Open Source - każdy może opublikować łatkę!

Jednak rozszerzenie go na inne aspekty projektowania schematu prawie na pewno spowodowałoby niepożądaną złożoność i zwiększyłoby możliwość niepowodzenia - coś, co zespół główny zdecydowanie wcześniej rozważy.

Skorzystałbym z porady @ xav0989 - używaj dbDeltajej zgodnie z jej intencją (podstawowa implementacja tabeli, dodawanie i korekty kolumn) i obsługuj dodatkowe funkcje za pomocą $wpdb.

TheDeadMedic
źródło