如何使用dbDelta()定义组合键

时间:2015-12-25 作者:Sisir

尝试使用创建表时出错dbDelta() 和复合主键。sql非常直截了当。

$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($sql);

This shows error

WordPress database error: [Multiple primary key defined]
ALTER TABLE wp_voicemail_call ADD PRIMARY KEY (user_id, call_id)
我做错了吗?如何使用dbDelta正确定义复合主键?

Note: 虽然显示了错误,但它仍会创建一个表,其中两列都设置为主键。

1 个回复
最合适的回答,由SO网友:birgire 整理而成

问题

如果表已经存在,您的代码仍将尝试执行以下查询:

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)
正在尝试添加另一个已定义的主键,我们只能使用其中一个。因此出现了错误。

此查询:

ALTER TABLE wp_voicemail_call ADD
来自empty line 高于PRIMARY KEY 线

dbDelta() 功能有this part 这将取消主要部分的设置:

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) 

PRIMARY 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
当表已存在时。

相关推荐

$wpdb->GET_RESULTS()不使用Unicode‘where’子句获取结果

我只需要一个简单的查询,就可以找到一个学生用孟加拉语写的名字记录。 $student_rcrd = $wpdb->get_results(\"SELECT * FROM student WHERE name=\'আবুল কালাম আজাদ\'\"); 虽然我的数据库中有\'আবুল কালাম আজাদ\', 查询返回零行!但与此查询不同,它工作得非常好- $student_rcrd = $wpdb->get_results(\"SELECT * FROM stud