hỗ trợ dbDelta cho FOREIGN KEY


9

Trên PHP 5.3.13 / MySQL 5.5.21, đoạn mã sau không hoạt động:

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);
 }

Nhà cung cấp mã đề xuất hạ cấp xuống MySQL 5.1.37 (không, cảm ơn) hoặc cập nhật sau:

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);
   }

Có vẻ như là một cách khá bẩn để khắc phục sự cố (không xóa tầng / cập nhật). Vì thế:

  1. Tôi có thực sự phải sống với điều đó cho đến khi dbDelta hỗ trợ FOREIGN KEY không?
  2. Có đúng là dbDelta chỉ hoạt động với khóa ngoại trong phiên bản MySQL 3 năm tuổi không?

1
Trong khi xóa tầng / cập nhật là tốt, chúng có thực sự cần thiết? Bạn có thể bao gồm phần đó trong mã của bạn, hoặc cấu trúc lại các bảng của bạn không?
T0xicCode

Tôi không chắc liệu chúng có cần thiết hay không, tôi chưa nghiên cứu mã bên thứ 3 này đủ để biết.
Gaia

1
TheDeadMedic là chính xác. Tuy nhiên, tôi chỉ tìm thấy Liên kết dbDelta và FOREIGN KEY này . Nó giải thích một cách xung quanh vấn đề. Nó làm việc cho tôi. Chúc may mắn!

Câu trả lời:


3

Tôi có thực sự phải sống với điều đó cho đến khi dbDelta hỗ trợ FOREIGN KEY không?

Thẳng thắn mà nói, vâng. Nhưng đó là vẻ đẹp của nguồn mở - bất kỳ ai cũng được chào đón để đăng một bản vá!

Tuy nhiên , việc mở rộng nó để bao quát các khía cạnh khác của thiết kế lược đồ gần như chắc chắn sẽ phát sinh sự phức tạp không mong muốn & nâng cao khả năng thất bại - điều mà nhóm nòng cốt sẽ mạnh mẽ cân nhắc trước.

Tôi sẽ lấy lời khuyên của @ xav0989 - sử dụng dbDeltacho mục đích của nó (thực hiện bảng cơ bản, bổ sung & điều chỉnh cột) và xử lý các tính năng bổ sung với $wpdb.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.