2014-10-12 2 views
0

나는 경우, 물론, (도시하지 않음) 별도의 문Mysql : 삽입 시도에서 ID를 가져 오는 가장 효율적인 방법은 무엇입니까?

INSERT IGNORE INTO users (some_data) VALUES ('test'); 
SELECT LAST_INSERT_ID(); <--- I do stuff with this. 

에 결과 user_id (기본 키 자동 증가 컬럼)를 사용하지만 some_data (고유 키 열)를 삽입하고 있어요 some_data이 이미 존재합니다 (매우 자주 발생합니다). LAST_INSERT_ID()은 0을 반환합니다.이 경우 고유 키 some_data을 기반으로 user_id을 얻는 가장 좋은 방법은 무엇입니까? 물론 별도의 WHERE 쿼리를 수행 할 수 있지만 이것이 가장 효율적인지는 확실하지 않습니다.

INSERT INTO users (id, some_col) VALUES (n,some_val) 
    ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), some_col=some_val; 

무시하지만 일을 할 수 없음 http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html에서

답변

1

?


편집 :

이이 some_valsome_col 업데이트됩니다, 명확하고 중복 된 행의 ID를 반환하는 LAST_INSERT_ID을 설정합니다.

INSERT INTO users (user_name) VALUES ('bobloblaw') 
    ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id); 

편집 2 : 당신은 중복의 모든 데이터를 업데이트하고 싶지만 당신이 원하는 당신을 제공하기 위해 LAST_INSERT_ID() 전화를 설정하지 않은 경우

그것은 단지뿐만 아니라이 될 수있다 :

(1) 내가 ID를 모르는 .... 일을하고 ID를

DELIMITER $$ 
CREATE PROCEDURE insert_test(val1 varchar(10), val2 varchar(10)) 
BEGIN 

    INSERT INTO test.test_table (col1, col2) SELECT val1, val2 FROM (select 1) as a 
    WHERE NOT EXISTS (
      select 1 from test.test_table t where t.col1 = val1 
    ); 

    SELECT id FROM test.test_table where col1 = val1; 

END $$ 
DELIMITER ; 
+0

어를 다시 얻기 위해 시저를 사용합니다. (2) 키가 중복되면 id를 0으로 설정하지 않겠습니까? – Agamemnus

+1

이 게시물을 확인하십시오 : http : //stackoverflow.com/questions/14383503/on-duplicate-key-update-same-as-insert 역시 당신의 문제인 것처럼 보입니다. – byrnedo

+0

byrnedo, 링크 주셔서 감사하지만 중요한 부분은 기존 항목의 삽입/업데이트 후에 ID를 얻습니다. 솔루션이 제공되지 않았습니다. – Agamemnus

관련 문제