2009-05-22 4 views
1

에 내가있어 다음과 같은 테이블에 삽입 ... SELECT으로 입력 오류를 중복 :MySQL의 : UNIQUE 제약

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입니다.

이 테이블은 현재 모두 동일한 stock_id (1)로 10,000 개 이상의 행을 가지고 있습니다. 내가 뭘하려고하는지 모든 행을 두 번, 새로운 stock_id (2 및 3), 그리고 '수량'에 대한 임의의 값으로 복제하는 것입니다. 잘 작동

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; 

:

다음은 SQL입니다. 다른 stock_id로 10 000+ 개의 새 행을 작성하므로 각 행에 대한 product_id가 이미 존재하더라도 고유성 제한이 위반되지 않습니다.

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

한 번 각 stock_id를 들어, 두 번 모든 PRODUCT_ID입니다 :

PRODUCT_ID에 의해 주문이 시점에서 테이블의 행의 예 (A VARCHAR는 추한하지만 필요), 서식을 변명. 이제 3 번째 주식을 비슷한 방식으로 작성하려고하지만 '3 AS stock_id'대신 '3 AS stock_id'를 입력하면 첫 번째 제품 행에 대해이 오류가 발생합니다.

"중복 항목 ' 0032705090062-3 '키 2에 대해

product_id 0032705090062와 stock_id 3의 조합이 갑자기 stock_id 1과 2 에서처럼 고유하지 만 고유성 제약이 위반 된 것 같습니다.

는 충분히 재미있게, 하나의 행이 생성되기 때문에, 새로운 행이 :

21563 0032705090062 3 5 

...하지만 내가 삽입 할 노력하고있어 10 000 +의 하나입니다.

무엇이 여기에 있습니까? 첫 번째 SELECT ... INSERT INTO가 작동하지만 두 번째 SELECT가 작동하지 않는 이유는 무엇입니까? 당신이 그것을 것 다시 실행할 때

22  0032705090062 1  1 
21  0032705090345 1  6 

을 잡고 처음으로, 그래서 당신은 당신이에 삽입하고 같은 테이블에서 선택하고

답변

2

는 다음 그러나

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

정말 고마워요! 나는 그것을 깨닫지 못했다. 이제 작동합니다. –

1

간단한은 (당신이 생각했습니다처럼되지 10.000) 20.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 만 삽입됩니다.

관련 문제