FOREIGN KEY에 대한 dbDelta 지원


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 버전의 외래 키와 만 작동한다는 것이 사실입니까?

1
계단식 삭제 / 업데이트는 훌륭하지만 완전히 필요합니까? 코드에 해당 부분을 포함 시키거나 테이블을 리팩터링 할 수 있습니까?
T0xicCode

필요한지 잘 모르겠습니다.이 타사 코드를 충분히 연구하지 않았습니다.
Gaia

1
DeadMedic가 정확합니다. 그러나 방금이 링크 dbDelta 및 FOREIGN KEY를 찾았습니다 . 문제를 해결하는 방법을 설명합니다. 그것은 나를 위해 일했다. 행운을 빕니다!

답변:


3

dbDelta가 FOREIGN KEY를 지원할 때까지 실제로 살아야합니까?

솔직히 그래요 그러나 이것이 오픈 소스의 아름다움입니다. 누구나 패치를 게시 할 수 있습니다.

그러나 스키마 설계의 다른 측면을 포괄하도록 확장하면 원치 않는 복잡성이 발생하고 실패 가능성이 높아질 것입니다. 핵심 팀은 미리 고려해야 할 사항입니다.

@ xav0989의 조언- dbDelta의도 (기본 테이블 구현, 열 추가 및 조정)에 사용하고 추가 기능을로 처리합니다 $wpdb.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.