2009-05-22 81 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。

相关问题