1

次の表があります。

CREATE TABLE `products_quantity` (
  `id` int(11) NOT NULL auto_increment,
  `product_id` varchar(100) NOT NULL,
  `stock_id` int(11) NOT NULL,
  `quantity` int(11) NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `product_id` (`product_id`,`stock_id`),
  KEY `products_quantity_product_id` (`product_id`),
  KEY `products_quantity_stock_id` (`stock_id`)
) ENGINE=MyISAM

product_id は別のテーブルへの外部キーであり、stock_id も同様です。

現在、テーブルには 10,000 行以上あり、すべて同じ stock_id (1) です。私がやろうとしているのは、すべての行を2回複製することです.2回とも新しいstock_id(2と3)と「数量」のランダムな値です。

SQLは次のとおりです。

INSERT INTO `products_quantity` (product_id, stock_id, quantity)
    SELECT product_id, 2 AS stock_id, FLOOR(-1 + (RAND() * 15)) AS random_quantity FROM products_quantity;

それはうまくいきます。別のstock_idで10000以上の新しい行を作成するため、各行のproduct_idが既に存在していても、一意性制約に違反していません.

この時点でのテーブル内の行の例は、product_id (VARCHAR、醜いが必要) で並べ替えられています。

22      0032705090062   1   1
10783   0032705090062   2   13
21      0032705090345   1   6
10784   0032705090345   2   0
...

これは、すべての product_id を 2 回 (stock_id ごとに 1 回) です。ここで、同様の方法で 3 番目の在庫を作成したい場合、前回とまったく同じクエリを使用して「3 AS stock_id」を代入すると、最初の製品行で次のエラーが発生します。

「キー 2 の重複エントリ '0032705090062-3'」

product_id 0032705090062 と stock_id 3 の組み合わせは、stock_id 1 と 2 と同じように一意ですが、突然、一意性制約に違反していると思われます。

おかしなことに、単一の行 IS が作成されるため、新しい行があります。

21563    0032705090062  3   5

...しかし、それは私が挿入しようとしている 10 000 以上の唯一のものです。

ここで何が欠けていますか?最初の SELECT...INSERT INTO は機能するのに、2 番目は機能しないのはなぜですか?

4

2 に答える 2