我有如下表分爲:的MySQL:重複輸入錯誤與SELECT ...插入具有唯一約束
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)。我想要做的是將所有行重複兩次,兩次都使用新的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創建10 000多個新行,因此不違反唯一性約束,儘管每行的product_id已經存在。
在這點在表中的行,用的product_id命令的例子(一個VARCHAR,醜但必要),原諒的格式:
22 0032705090062 1 1
10783 0032705090062 2 13
21 0032705090345 1 6
10784 0032705090345 2 0
...
這是每一個的product_id兩次,一次爲每個STOCK_ID。現在,如果我想以類似的方式創建第三隻股票,並使用與上一次完全相同的查詢,但用'3 AS stock_id'替換,則第一行產品會出現此錯誤:
「重複條目」 '對於密鑰2「
突然,唯一性約束被認爲違反了,儘管product_id 0032705090062和stock_id 3的組合與stock_id 1和2一樣唯一,不是嗎?
有趣的是,單列被創建,所以有一個新行:
21563 0032705090062 3 5
...但是,這是我在試圖插入的10 000多個唯一的一個。
我在這裏錯過了什麼?爲什麼第一個SELECT ... INSERT INTO工作,但第二個不?
非常感謝!我沒有意識到這一點。現在工作。 – 2009-05-22 10:46:47