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_category
和id_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
答案 0 :(得分:1)
除非您指定KEY
或UNIQUE KEY
,否则指定PRIMARY 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 syntax。
答案 1 :(得分:0)
应该通过管理界面和底层对象代码施加约束,因此您不应该遇到存在重复的情况,尽管编写一个cron作业以删除任何确实发生的任何操作都很容易。
你可以强迫这个独特的,但这并不能解决为什么会发生这种情况的根本问题......老实说,我不明白你试图解决的问题是什么?如果您自己导入产品,那么您应该使用对象接口而不是直接写入这些表,否则,是的 - 可能会发生奇怪的事情。