Поддержка 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 не поддерживает FOREIGN KEY ?
  2. Правда ли, что dbDelta работает только с внешним ключом в 3-летней версии MySQL?
Gaia
источник
1
Хотя каскадные удаления / обновления хороши, они абсолютно необходимы? Можете ли вы включить эту часть в свой код или изменить ваши таблицы?
T0xicCode
Я не уверен, нужны ли они, я недостаточно изучил этот сторонний код, чтобы знать.
Гайя
1
The DeadMedic является правильным. Тем не менее, я только что нашел эту ссылку dbDelta и FOREIGN KEY . Это объясняет способ решения проблемы. Это сработало для меня. Удачи!

Ответы:

3

Должен ли я жить с этим, пока dbDelta не поддерживает FOREIGN KEY?

Откровенно говоря, да. Но в этом прелесть открытого исходного кода - любой желающий может выложить патч!

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

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

TheDeadMedic
источник