2

PrestaShop 中的表ps_category_product具有以下结构

 # Obtained using SHOW CREATE TABLE `ps_category_product`
 CREATE TABLE `ps_category_product` (
   `id_category` int(10) unsigned NOT NULL,
   `id_product` int(10) unsigned NOT NULL,
   `position` int(10) unsigned NOT NULL DEFAULT '0',
   KEY `category_product_index` (`id_category`,`id_product`),
   KEY `id_product` (`id_product`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

对我来说不是很清楚,但似乎字段id_categoryid_product表之间应该是唯一的,但由于某种原因 MySQL 允许我插入重复项:

mysql> select * from ps_category_product limit 10;
+-------------+------------+----------+
| id_category | id_product | position |
+-------------+------------+----------+
|          11 |          1 |        1 |
|          11 |          2 |        1 |
|          11 |          3 |        1 |
|          11 |          4 |        1 |
|          11 |          5 |        1 |
|          11 |          6 |        1 |
|          11 |          7 |        1 |
|          11 |          8 |        1 |
|          11 |          9 |        1 |
|          11 |         10 |        1 |
+-------------+------------+----------+
10 rows in set (0.00 sec)

mysql> INSERT INTO `ps_category_product` VALUES(11, 1, 1);
Query OK, 1 row affected (0.05 sec)

我怎样才能防止这种情况发生?

稍后编辑

这是prestashop中的一个错误。看看http://forge.prestashop.com/browse/PSCFI-4397

4

2 回答 2

1

除非您指定或,否则指定KEY不会强制执行唯一约束。UNIQUE KEYPRIMARY KEY

尝试使用以下 DDL 重新创建表:

CREATE TABLE `ps_category_product` (
   `id_category` int(10) unsigned NOT NULL,
   `id_product` int(10) unsigned NOT NULL,
   `position` int(10) unsigned NOT NULL DEFAULT '0',
   UNIQUE KEY `category_product_index` (`id_category`,`id_product`),
   KEY `id_product` (`id_product`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这应该够了吧。

查看MySQL CREATE TABLE 语法以获取更多信息。

于 2012-04-18T15:29:43.840 回答
0

约束应该通过管理界面和底层对象代码施加,所以你不应该有重复的情况,尽管编写一个 cron 作业来删除确实发生的任何事情很容易。

您可以强制执行此唯一操作,但这并不能解决为什么会发生这种情况的根本问题……老实说,我不明白您要解决的问题是什么?如果您自己导入产品,那么您应该使用对象接口而不是直接写入这些表,否则,是的 - 可能会发生奇怪的事情。

于 2012-04-18T22:34:28.523 回答