如何向插件数据库表添加索引


10

我为正在开发的插件创建了一些其他表,并且需要向这些表添加索引。

WordPress执行此操作的方式是什么?

使用dbDelta()似乎不起作用,并且我在日志中没有看到任何错误。

Answers:


4

您可以使用wpdb :: query()执行任意 SQL语句,包括数据定义语句,例如

function
create_index ()
{
    global $wpdb ;

    $sql = "CREATE INDEX my_index ON {$wpdb->prefix}my_table (my_column)" ;

    $wpdb->query ($sql) ;

    return ;
}

注意:因为$wpdb->query()可以执行任意 SQL,所以如果传递给它的语句包含任何用户输入,则应使用wpdb :: prepare()防止SQL注入攻击。

但这引发了一个问题:您是如何创建特定于插件的表的?是“手动”还是编程方式?如果以编程方式,您是否不使用$wpdb->query()?如果您是“手动”执行的,那么您确实应该在激活插件后创建表(及其索引)。

有关如何挂钩插件激活(和/或停用和卸载)以执行诸如创建私有表之类的操作,请参见另一个WPSE问题的出色答案。


感谢您回答这个问题,尽管它已经存在5个月了。我最终这样做了,但是不确定这是否是“正确的方法”。下次我尝试执行此操作时将有很大帮助。
牛奶

@牛奶我的荣幸。我认为您已经解决了您的问题,或者已经放弃了:-)我回答了它(甚至在您提出要求后,甚至是5个月)就可以帮助其他有相同问题的人,搜索WPSE并提出您的问题。
Paul'Sparrow Hawk'Biron

3

使用dbDelta,在PRIMARY KEY的顶部,可以包括单词KEY来为其他列创建索引:

您必须使用关键字KEY而不是其同义词INDEX,并且必须至少包含一个KEY。

核心中来自schema.php的示例:

CREATE TABLE $wpdb->termmeta (
  meta_id bigint(20) unsigned NOT NULL auto_increment,
  term_id bigint(20) unsigned NOT NULL default '0',
  meta_key varchar(255) default NULL,
  meta_value longtext,
  PRIMARY KEY  (meta_id),
  KEY term_id (term_id),
  KEY meta_key (meta_key($max_index_length))
) $charset_collate;

来源:codex-使用插件创建表

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.