Поддержка dbDelta для FOREIGN KEY

В 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?
8 голосов | спросил Gaia 21 Maypm12 2012, 17:01:28

1 ответ


3
  

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

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

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

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

ответил TheDeadMedic 28 J000000Saturday12 2012, 19:43:19

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132