和你有类似的问题。你的问题是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触发器)或定义其他表之间的关系)。为了实用性/现实世界的使用,请做任何您最熟悉或对您的项目最有意义的事情。
正如其他人在对您的问题的评论中所述,您可能根本不需要复合键。由于我不知道您是如何使用此表和数据的,所以我提供了与您发布的代码尽可能相似的代码。
希望这有帮助。