dbDelta підтримка FOREIGN 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 працює лише із зовнішнім ключем у 3-річній версії MySQL?

1
Хоча каскадні видалення / оновлення є приємними, чи вони абсолютно необхідні? Чи можете ви включити цю частину у свій код або переробляти таблиці?
T0xicCode

Я не впевнений, чи потрібні вони, я ще недостатньо вивчив цей сторонній код, щоб знати.
Гая

1
TheDeadMedic правильний. Однак я щойно знайшов це посилання dbDelta та FOREIGN KEY . Це пояснює спосіб вирішення проблеми. Це працювало для мене. Удачі!

Відповіді:


3

Чи справді мені доводиться жити з цим, поки dbDelta не підтримає ІНОЗЕМНИЙ КЛЮЧ?

Відверто кажучи, так. Але це краса відкритого коду - кожен бажаючий може опублікувати виправлення!

Однак розширення його, щоб охопити інші аспекти дизайну схем, майже напевно спричинило б небажану складність та збільшить можливість виходу з ладу - те, що головна команда настійно задумає попередньо.

Я б скористався порадою @ xav0989 - використовуйте dbDeltaдля свого наміру (основна реалізація таблиці, доповнення стовпців та коригування) та обробляйте додаткові функції $wpdb.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.