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?

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.