質問: "create table {$wpdb->prefix}voicemail_call ( user_id bigint(9) unsigned not null, call_id bigint(9) unsigned not null, opened bool default 0 not null, primary key (user_id, call_id) );"; dbdelta($sql); これはエラーを示します wordpress database error: [multiple primary key defined] alter table wp_voicemail_call add primary key (user_id, call_id) 私はそれを間違っていますか? dbdeltaを使用して複合主キーを正しく定義する方法 注: エラーは表示されますが、両方の列が主キーとして設定されているテーブルが作成されます。
回答: 問題テーブルがすでに存在する場合、コードは引き続き以下のクエリを実行しようとします。1) alter table wp_voicemail_call change column user_id user_id bigint(9) unsigned not null 2) alter table wp_voicemail_call change column call_id call_id bigint(9) unsigned not null 3) alter table wp_voicemail_call change column opened opened bool default 0 not null 4) alter table wp_voicemail_call add 5) alter table wp_voicemail_call add primary key (user_id, call_id) このクエリに注意してください。alter table wp_voicemail_call add primary key (user_id, call_id) 既に定義されている別の主キーを追加しようとしていますが、そのうちの1つだけを持つことができます。したがって、エラーです。このクエリ:alter table wp_voicemail_call add primary key行の上の空行から来ています。dbdelta()関数には この部分 があります。foreach ( $index_strings as $index_string ) { if ( ! ( ( $aindex = array_search( $index_string, $indices ) ) === false ) ) { unset( $indices[ $aindex ] ); break } } しかし、配列検索は何らかの理由であなたのケースでは常にfalseを返します。私はもっと深く掘り下げました。あなたの場合は$indices配列は次のようになります。array ( [0] => [1] => primary key (user_id, call_id) ) しかし$index_strings配列はarray ( [0] => primary key (user_id,call_id) [1] => primary key (user_id,call_id) ) だから我々はミスマッチを見ることができます:primary key (user_id,call_id) versusprimary key (user_id, call_id) ...ひとつのスペース!提案された解決策したがって、余分な空行と余分なスペースを削除すると、次のようになります。$sql = "create table {$wpdb->prefix}voicemail_call ( user_id bigint(9) unsigned not null, call_id bigint(9) unsigned not null, opened bool default 0 not null, primary key (user_id,call_id) );"; それならこれらのクエリをdbdelta()で実行するだけです。1) alter table wp_voicemail_call change column user_id user_id bigint(9) unsigned not null 2) alter table wp_voicemail_call change column call_id call_id bigint(9) unsigned not null 3) alter table wp_voicemail_call change column opened opened bool default 0 not null テーブルが既に存在する場合.