2012-06-29 4 views
-2

두 개의 테이블이 있습니다. 하나의 표에 단어가 포함되어 있습니다. 다른 테이블은 포인트를 포함합니다.일부 조건으로 여러 레코드를 삽입하는 방법

table words: 

id word 


table points: 

id wordid x y 

단어 열은 고유합니다.

나는 현재 입력 된 x 값과 단어 | y 값의 목록을 취하는 저장 프로 시저를 작성하려고합니다. 예를 들어

:

그것의 초기 단어 테이블 행 :

id word 
1 Carrot 
2 Apple 
3 Potato 

우리는 절차 StoreData(x = 5, words = { Carrot:123, Onion:321 })를 호출합니다. 그 결과

우리는이 :

Words table: 

    id word 
    1 Carrot 
    2 Apple 
    3 Potato 
    4 Onion 


Points table:  
id wordid x y 
1 1 5 123 
2 4 5 321 

어떻게 할 수 있나요?

+0

귀하의 질문은 더 나은 제목을 사용할 수 있습니다

은 (덧붙여, 내 구체화 테이블 t는 기본적으로 생성하고 저장 프로 시저를 호출하기 전에 채울 수있을 것 테이블입니다). "이 쿼리를 수행하는 방법"은 일반적으로 스택 오버플로에 대한 1/4의 제목이됩니다. :-) – AllInOne

+0

@Randy Ofcourse 여러 쿼리를 사용하여 straignforward 방법을 알고 있지만 매우 느리게 작동합니다. 코드 작성 안함. 그냥 내가 예제를 찾을 수있는 몇 가지 팁을 줘. 나는 mysql에 매우 익숙하기 때문에 그러한 프로 시저를 작성하기가 어렵다. – Neir0

+0

@AllInOne 내가 편집 한 제목. – Neir0

답변

2

저장 프로 시저에 매개 변수로 구조화 된 데이터를 전달할 수 없습니다. 먼저 어딘가에 (임시) 테이블에 삽입 한 다음 프로 시저 내에서 해당 테이블의 내용을 읽어야합니다. 따라서, 당신은뿐만 아니라 당신의 대상 테이블에 직접 삽입 할 수 있습니다 :

INSERT IGNORE INTO Words (word) VALUES ('Carrot'), ('Onion'); 

INSERT INTO Points (wordid, x, y) 
    SELECT Words.id, 5, y 
    FROM Words NATURAL JOIN (
     SELECT 'Carrot' AS word, 123 AS y 
    UNION ALL 
     SELECT 'Onion' AS word, 321 AS y 
) AS t; 

sqlfiddle에를 참조하십시오.

DELIMITER ;; 
CREATE PROCEDURE StoreData(IN x INT) BEGIN 
    INSERT IGNORE INTO Words SELECT word FROM args; 
    INSERT IGNORE INTO Points (wordid, x, y) 
    SELECT Words.id, 5, y FROM Words NATURAL JOIN args; 
END;; 
DELIMITER ; 

DROP TEMPORARY TABLE IF EXISTS args; 
CREATE TEMPORARY TABLE args (word VARCHAR(20), y INT); 
INSERT INTO args VALUES ('Carrot', 123), ('Onion', 321); 
CALL StoreData(5); 
+0

초당 수천 단어를 저장해야합니다. 해결책이 충분합니까? – Neir0

+0

@ Neir0 : 아마도 몇 가지 테스트를 실행하고 벤치 마크해야합니다. – eggyal

관련 문제