DBDelta不使用组合键创建表

时间:2015-03-08 作者:FeralReason

我已经花了三天的时间试图解决这个问题,阅读了所有关于dbDelta的参考资料。

我的最终目标是创建一个包含唯一ad\\U id、ad\\U触发器对的表。

这不会创建表:

if($wpdb->get_var("SHOW TABLES LIKE \'$ad_trigger_table_name\'") != $ad_trigger_table_name) {
$sql = "CREATE TABLE " . $ad_trigger_table_name . " (
    ad_id int(12) NOT NULL,
    ad_trigger text NOT NULL,
    PRIMARY KEY  (ad_id,ad_trigger) 
     );";
dbDelta($sql);
}
这也不是:

$sql = "CREATE TABLE " . $ad_trigger_table_name . " (
    ad_id int(12) NOT NULL,
    ad_trigger text NOT NULL,
    UNIQUE KEY pkey (ad_id,ad_trigger)    
     );";
dbDelta($sql);
这确实可行,但并没有给我一个复合键。

if($wpdb->get_var("SHOW TABLES LIKE \'$ad_trigger_table_name\'") != $ad_trigger_table_name) {
$sql = "CREATE TABLE " . $ad_trigger_table_name . " (
    id int(12) NOT NULL auto_increment,
    ad_id int(12) NOT NULL,
    ad_trigger text NOT NULL,
    PRIMARY KEY  (id)  
     );";
dbDelta($sql);
}
任何人都能对这件事有所了解,那就太好了!

1 个回复
SO网友:Slicktrick

和你有类似的问题。你的问题是ad_trigger 字段是TEXT 领域你需要把这个VARCHAR 允许索引。

TEXT 类型不存储在表中。相反,指针存储在表中,数据存储在其他位置。虽然你可以为他们创建索引,但我认为这个过程对于WordPress来说太复杂了(参考:StackOverflow: Indexing a MySQL Text Column). 如果使用标准数据类型,例如VARCHAR.

我建议使用下面的代码。我个人的偏好是总是包括一个独特的ID 字段与数据分开,因为它可以帮助更轻松地更新表数据。另外,更改VARCHAR 长度到您确信对您的数据有用的长度。下面的代码将其设置为TINYTEXT.

$sql = "CREATE TABLE " . $ad_trigger_table_name . " (
    id INT(12) NOT NULL AUTO_INCREMENT,
    ad_id INT(12) NOT NULL,
    ad_trigger VARCHAR(255) NOT NULL,
    PRIMARY KEY  (id),
    UNIQUE KEY pkey (ad_id,ad_trigger)
    );";
另一种选择是为每个触发器创建某种唯一的id(可能将它们放在自己的表中,然后在此表中引用触发器id)。在这种情况下,我建议如下。

$sql = "CREATE TABLE " . $ad_trigger_table_name . " (
        id INT(12) NOT NULL AUTO_INCREMENT,
        ad_trigger TEXT NOT NULL,
        PRIMARY KEY  (id),
        );";

$sql = "CREATE TABLE " . $ad_id_trigger_relationship_table_name . " (
        id INT(12) NOT NULL AUTO_INCREMENT,
        ad_id INT(12) NOT NULL,
        ad_trigger_id INT(12) NOT NULL,
        PRIMARY KEY  (id),
        UNIQUE KEY pkey (ad_id,ad_trigger_id)
        );";
这将更符合“理想”数据库实践(即,一个表包含特定数据(ad触发器)或定义其他表之间的关系)。为了实用性/现实世界的使用,请做任何您最熟悉或对您的项目最有意义的事情。

正如其他人在对您的问题的评论中所述,您可能根本不需要复合键。由于我不知道您是如何使用此表和数据的,所以我提供了与您发布的代码尽可能相似的代码。

希望这有帮助。

结束

相关推荐

MySQL5.5升级--破解WordPress

我从Debian 6升级到7,在升级过程中,MySQL要求输入新的根密码,我有点困惑,但还是键入了它。我想这会创建一个名为“mysql”的新数据库,因为现在有“wordpress”和“mysql”目录:# ls /var/lib/mysql/ debian-5.1.flag debian-5.5.flag ibdata1 ib_logfile0 ib_logfile1 mysql mysql_upgrade_info performance_schema wordpress