次の表があります。
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 番目は機能しないのはなぜですか?