2016-01-10 22 views
0

我想創建一個wordpress插件,將使用兩個數據庫,我需要他們有FOREIGN KEY,但不能讓插件創建它們只有當我刪除外國關鍵,我可以讓他們創建一張桌子。Wordpress創建數據庫與FOREIGN KEY

global $wpdb; 
    $table_name = $wpdb->prefix . 'aa_accessform'; 
    $table_name2 = $wpdb->prefix . 'aa_formcomments'; 

    $charset_collate = $wpdb->get_charset_collate(); 

    $wpdb->query(
     "CREATE TABLE IF NOT EXISTS $table_name (
      id    INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
      customer_id  INT UNSIGNED NOT NULL, 
      appointment_id INT UNSIGNED NOT NULL, 
      notes TEXT, 
      token VARCHAR(255) DEFAULT NULL 
     ) ENGINE = INNODB 
     DEFAULT CHARACTER SET = utf8 
     COLLATE = utf8_general_ci" 
    ); 
    require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); 
    dbDelta($sql); 
    $wpdb->query(
     "CREATE TABLE IF NOT EXISTS $table_name2 (
      id    INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
      customer_codes__id  INT UNSIGNED NOT NULL, 
      appointment_codes_id INT UNSIGNED NOT NULL, 
      notes TEXT, 
      token VARCHAR(255) DEFAULT NULL, 
      PRIMARY KEY (id), 
      FOREIGN KEY (customer_codes__id) REFERENCES ".$table_name." (id) 
     ) ENGINE = INNODB 
     DEFAULT CHARACTER SET = utf8 
     COLLATE = utf8_general_ci" 
    ); 
    dbDelta($sql); 

我很想知道什麼是錯的。

+0

如果刪除引號'.. REFERENCES $ table_name(id)....' – Mihai

+0

,則定義看起來正確。您是否嘗試使用純MySQL客戶端在PHP上下文之外創建它們?如果第一個表沒有成功創建,或者它已經存在一個不同的定義,第二個表會失敗。 –

+0

在sqlfiddle中創建你的表(http://sqlfiddle.com/#!9/c3612)我確實遇到過「定義了多個主鍵」,因爲你在'$'的id中定義了'PRIMARY KEY' table_name2',並在'FOREIGN KEY'定義之前稍後重複。刪除'PRIMARY KEY(id)'工作,但不符合你必須刪除FK。無論如何,你應該在兩個語句後檢查錯誤,以找出MySQL正在報告的錯誤。 –

回答

1

我找到了答案,現在正在進行下面的工作。

require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); 

    global $wpdb; 
    $table_name = $wpdb->prefix . 'aa_accessform'; 
    $table_name2 = $wpdb->prefix . 'aa_formcomments'; 


    $wpdb->query(
    "CREATE TABLE IF NOT EXISTS $table_name (
     id    INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
     customer_id  INT UNSIGNED NOT NULL, 
     appointment_id INT UNSIGNED NOT NULL, 
     notes TEXT, 
     token VARCHAR(255) DEFAULT NULL 
    ) ENGINE = INNODB 
    DEFAULT CHARACTER SET = utf8 
    COLLATE = utf8_general_ci" 
); 

dbDelta(); 

$wpdb->query(
    "CREATE TABLE IF NOT EXISTS $table_name2 (
     id    INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
     customer_codes_id  INT UNSIGNED NOT NULL, 
     appointment_codes_id INT UNSIGNED NOT NULL, 
     notes TEXT, 
     token VARCHAR(255) DEFAULT NULL, 
     FOREIGN KEY (customer_codes_id) REFERENCES $table_name(id) 
    ) ENGINE = INNODB 
    DEFAULT CHARACTER SET = utf8 
    COLLATE = utf8_general_ci" 
); 

dbDelta(); 

注意下面的線是真正的解決 外鍵(customer_codes_id)參考$表名(ID)//正確 下面的不正確的行是: 「$ table_name的」 外鍵(customer_codes__id)參考(id)//錯誤

+0

謝謝!它幫助了我。 – forethought

+0

由於您使用'$ wpdb-> query()'創建表,所以您可以刪除對'dbDelta()'的調用。如果你想使用'dbDelta()',那麼你必須傳遞一個SQL語句或一組SQL語句。但是'dbDelta()'不支持使用外鍵。它主要用於簡單的表格創建和插件升級的自動錶格修改;但是,更復雜的場景(如外鍵,刪除列等)不由它處理。 – Slicktrick

+0

有關[dbDelta支持FOREIGN KEY]的更多詳細信息,請參閱此答案(https://wordpress.stackexchange.com/questions/52783/dbdelta-support-for-foreign-key) – Slicktrick