2011-09-21 4 views
35

내가이 명령을 사용하여 두 개의 열이 테이블에 일부 단어를 삽입하고 : MySQL에서 삽입 된 여러 행의 ID를 얻으려면 어떻게해야합니까?

  1. INSERT IGNORE INTO terms (term) VALUES ('word1'), ('word2'), ('word3'); 
    
    어떻게 각 단어가 삽입 된 행의 ID (기본 키)를 얻을 수 있습니다. 을 실행 한 후 "55,56,57"과 같은 값을 반환하는 것을 의미합니다. MySQL에 대한 응답이 있습니까?

  2. 용어 열은 UNIQUE입니다. 용어가 이미 존재하는 경우, MySQL은 그것을 삽입하지 않습니다. 이 중복에 대한 참조 (즉, 용어가 존재하는 행의 ID)를 반환 할 수 있습니까? 응답은 "55, , 56"입니다.

답변

35
  1. 당신은 SELECT LAST_INSERT_ID();를 통해 또는 mysql_insert_id() 전화 (어떤 언어에서) 프레임 워크/MySQL의 라이브러리를 가지고 통해 그것을 얻을.

  2. 그럴 수 없습니다. 거기에 당신이 삽입 후 ID를 쿼리해야합니다.

+5

1. OP 쇼와 같이 멀티 행 삽입물에는 작동하지 않습니다. – ceejayoz

+0

정답은 +1입니다. : D – brenjt

+2

오른쪽 - 'INSERT IGNORE'가없는 사람. 그러나 'IGNORE '가 아닌 경우에는 생성되고 삽입 된 첫 번째 값을줍니다. – glglgl

3

왜 그냥 :

SELECT ID 
    FROM terms 
WHERE term IN ('word1', 'word2', 'word3') 
+0

이전에 삽입 된 용어를 가져오고 선택 쿼리가 실행되기 전에 다른 레코드가 레코드를 삽입하는 경쟁 조건에 취약 할 수 있습니다. – ceejayoz

+2

?? 용어는 UNIQUE 조건을 가지고 있습니다. 경쟁 조건에서 SELECT에 영향을 줄 수있는 유일한 것은 다른 INSERT가 아니라 DELETE입니다. OP의 (2)에 따르면 이전에 삽입 한 레코드의 ID를 포함하기를 원합니다. – mellamokb

+0

그건 내가 염두에 두었던거야. 하지만 몇 줄의 코딩이 필요합니다. SELECT 외에도 결과를 가져 와서 while 루프 (PHP에서 사용)에서 가져와야합니다. 나는 일종의 mysql 응답을 찾기를 희망한다. – Googlebot

1

첫째, 방금 삽입 한 ID를 얻으려면, 당신은 같은 것을 할 수 있습니다 :

SELECT LAST_INSERT_ID() ; 

케어는,이 마지막 INSERT 쿼리 이후에만 작동합니다 그리고을 최초의 ID 만 반환합니다 다중 삽입물이있는 경우!

그런 다음 IGNORE 옵션을 사용하면 삽입되지 않은 행을 가져올 수 있다고 생각하지 않습니다. INSERT IGNORE을 만들 때 MySQL에 중복 항목을 작성해야하는 행을 무시하도록합니다.

이 옵션을 지정하지 않으면 INSERT이 중지되고 해당 줄이 중복됩니다.

+0

IGNORE가 없어도 단일 행 INSERT에서만 작동합니다. 내 명령은 복수 행 INSERT – Googlebot

+0

내 대답의 첫 부분 만 IGNORE를 포함하고있었습니다. –

+1

PHP를 사용하는 경우 각 구절에 단일 INSERT가있는 루프를 사용하여 테이블에 ID를 저장할 수 있습니다. –

관련 문제