该函数无法在MariaDB服务器上创建表

时间:2018-05-30 作者:Andrew B.

该函数在MySQL服务器上运行良好,但无法在MariaDB服务器上创建表。有什么问题吗?

    public function create_table() {
    $current_version = get_option(\'wpsm_db_table_version\');
    if($current_version && $current_version == $this->db_version && $this->db->get_var("SHOW TABLES LIKE \'$this->table_name\'") == $this->table_name){
        return;
    }

    $sql = "CREATE TABLE ". $this->table_name ." (
            id bigint(20) unsigned NOT NULL auto_increment,
            name varchar(255) NOT NULL default \'\',
            rows int(11) NOT NULL default 0,
            cols int(11) NOT NULL default 0,
            subs varchar(255) NOT NULL default \'\',
            color varchar(255) NOT NULL default \'\',
            responsive tinyint(1) DEFAULT \'0\',
            tvalues longtext NOT NULL,
            UNIQUE KEY id (id)
            ) $this->charset_collate;";

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

    // since v.1.1
    if($this->db->get_var("SHOW TABLES LIKE \'$this->old_table_name\'") == $this->old_table_name){
        $this->upgrade_new_name_table();
    }

    update_option(\'wpsm_db_table_version\', $this->db_version);
}
这是日志文件中的记录:

WordPress database error You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near \'rows int(11) NOT NULL default 0,
            cols int(11) NOT NULL default 0,
            subs v\' at line 4 for query CREATE TABLE...

1 个回复
SO网友:Ramesh Elamathi

我不知道你为什么要为你的“ID”创建一个唯一的约束,它可以是主键。

另外,请注意,当您使用唯一键索引或复合键或主键以外的任何其他索引创建表时,dbDelta在某些版本的MariaDB中会失败。

解决方法是首先创建表:

 $sql = "CREATE TABLE ". $this->table_name ." (
        id bigint(20) unsigned NOT NULL auto_increment,
        name varchar(255) NOT NULL default \'\',
        rows int(11) NOT NULL default 0,
        cols int(11) NOT NULL default 0,
        subs varchar(255) NOT NULL default \'\',
        color varchar(255) NOT NULL default \'\',
        responsive tinyint(1) DEFAULT \'0\',
        tvalues longtext NOT NULL,
        PRIMARY KEY (id)
        ) $this->charset_collate;";
require_once( ABSPATH . \'wp-admin/includes/upgrade.php\' );
dbDelta( $sql );
然后,您可以使用$wpdb使用“ALTER TABLE”方法创建唯一索引。

global $wpdb;
$wpdb->query("ALTER TABLE `{$this->table_name}` ADD UNIQUE KEY(`column_name`)");
注意:在逻辑中运行上述查询之前,可能需要先检查索引是否存在。

希望这有帮助:-)

结束

相关推荐

load post data into mysql

我有几百行产品数据,这些数据将作为帖子显示在wordpress网站上。我确信有一种方法可以将所有这些数据直接加载到数据库中,然后让管理员和;前端UI将这些作为新帖子填充。但据我所知,帖子的各个方面都被填充/存储在不同的表中。我应该将这些数据加载到哪些表中,以避免从管理UI手动创建每个表?