DBDelta:对于刚创建的表,“表不存在”

时间:2016-02-24 作者:ig343

当我运行以下代码时:

    global $wpdb;
    require_once( ABSPATH . \'wp-admin/includes/upgrade.php\' );

    $table_tags = $wpdb->prefix . "tags_tb";
    $sql = "CREATE TABLE $table_tags (
                tag text,
                tag_id tinyint,
                UNIQUE KEY id (id)
            ) $charset_collate"; 
    $array = dbDelta( $sql );
    print_r(array_values($array));

    echo $wpdb->insert( 
         $table_tags, 
         array( 
               \'tag_id\' => 1, 
               \'tag\' => "#AireLibre"
            ) 
         );  
    echo $wpdb->last_error;
我得到以下输出:

(
    [0] => Created table wp_tags_tb
)
Table \'acsm_28e28895e1cdaee.wp_tags_tb\' doesn\'t exist
我认为这没有任何意义。该表是正确创建的,但在执行查询时它不存在。

为什么会发生这种情况?

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

浏览一下您的代码,我发现了一些潜在的问题。根据这个Codex page dbDelta“挑剔”;

您必须在SQL语句中将每个字段放在自己的行上。

在单词主键和主键定义之间必须有两个空格。

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

在字段名周围不能使用任何撇号或反勾号。

字段类型必须全部为小写。

SQL关键字(如CREATE TABLE和UPDATE)必须为大写。

必须指定接受长度参数的所有字段的长度。例如,int(11)。

您提供的代码在尚未创建的字段上显示唯一的键,键和字段名称之间必须有2个空格。适当时,应规定长度。

Code Reference 页面显示WP使用dbDelta的位置。查看这些函数可能有助于处理DBDelta的“挑剔”。

编辑:

下面是升级的一个示例。php

function install_global_terms() {
    global $wpdb, $charset_collate;
    $ms_queries = "
CREATE TABLE $wpdb->sitecategories (
  cat_ID bigint(20) NOT NULL auto_increment,
  cat_name varchar(55) NOT NULL default \'\',
  category_nicename varchar(200) NOT NULL default \'\',
  last_updated timestamp NOT NULL,
  PRIMARY KEY  (cat_ID),
  KEY category_nicename (category_nicename),
  KEY last_updated (last_updated)
) $charset_collate;
";
// now create tables
    dbDelta( $ms_queries );
}