2009-05-22 45 views
1

我有如下表分爲:的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工作,但第二個不?

回答

2

你從你插入到相同的表中選擇,所以第一次它抓住

22  0032705090062 1  1 
21  0032705090345 1  6 

然後插入

10783 0032705090062 2  13 
10784 0032705090345 2  0 

但是當您再次運行它,它會:

GET  22  0032705090062 1  1 
INSERT 21563 0032705090062 3  5 
GET  10783 0032705090062 2  13 
INSERT   0032705090062 3 <-- oops, already exists 

您只需將WHERE stock_id = 1添加到您的選擇

+0

非常感謝!我沒有意識到這一點。現在工作。 – 2009-05-22 10:46:47

1

簡單:因爲有20.000行現在(不是10.000,就像你想)

INSERT INTO `products_quantity` (product_id, stock_id, quantity) 
    SELECT 
     product_id, 
     3 AS stock_id, 
     FLOOR(-1 + (RAND() * 15)) AS random_quantity 
    FROM 
     products_quantity; 
    WHERE 
     stock_id = 1 /* !!!!! */ 

你的第二個插入失敗。添加where子句可確保只插入10.000。

相關問題