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 に答える