2013-08-08 1 views
0

자동 증분 기본 키와 고유 한 문자열 값 키 (sha-1 해시)가 모두있는 테이블이있는 mysql 데이터베이스가 있습니다.MYSQL : 중복 고유 키가있는 레코드를 삽입 할 때 기존 기본 키 가져 오기?

기존 레코드와 동일한 sha-1 해시를 가진 레코드를 추가하려고하면 기존 레코드의 기본 키를 가져 오려고합니다. 기존 해시 값이있는 레코드를 삽입 할 때 예외를 방지하기 위해 "INSERT ... DUPLICATE KEY UPDATE"또는 "INSERT IGNORE"와 같은 것을 사용할 수 있습니다.

그러나 그런 상황이 발생하면 기존 레코드의 기본 키를 검색해야합니다. 단일 SQL 문을 사용하여이를 수행 할 수있는 방법을 찾을 수 없습니다. 중요하다면, 제 코드가 Java이고 JDBC를 사용하고 있습니다.

또는 두 개의 명령문 (결과가없는 경우 삽입 또는 중복 키가있는 경우 삽입)을 사용하여 수행 할 수 있습니다. 그러나 나는 하나의 문장이 더 효율적일 것이라고 생각한다.

+1

기존 레코드의 기본 키 "? – Stephan

+1

한 문장으로는 그럴 수 없습니다. –

답변

2

기존의 레코드와 동일한 sha-1 해시를 가진 레코드를 추가하려고하면 기존 레코드의 기본 키를 가져 오려고합니다. 은 기존의 해시 값이 인 레코드를 삽입 할 때 예외를 방지하기 위해 "INSERT ... ON DUPLICATE KEY UPDATE"또는 "INSERT IGNORE"와 같은 것을 사용할 수 있습니다.

당신이 상관없이 당신이 뭘하려 컬럼에 UNIQUE 인덱스를 가질 경우, RDMS는 합니다 (NULL 값 제외) 해당 열의 중복을 허용하지 것입니다.

당신이 말했듯이, 이것이 추가되면 "오류"를 예방할 수있는 해결책이 있습니다. 아마도 INSERT IGNORE 일 것입니다.

어쨌든 INSERTUPDATE은 데이터베이스를 수정합니다. MySQL 절대 이러한 명령문의 반환 값. DB를 읽는 유일한 방법은 SELECT 문을 사용하는 것입니다.

INSERT IGNORE INTO tbl (pk, sha_key) VALUES (...), (...); 
SELECT pk, sha_key FROM tbl WHERE sha_key IN (...); 
--            ^^^ 
--    Here the list of the sha1 keys you *tried* to insert 
+0

INSERT와 UPDATE가 결코 값을 돌려주지 않는다는 주장은 완전히 사실이 아닙니다.일부 데이터베이스 (예 : [PostgreSQL] (http://www.postgresql.org/docs/9.2/static/sql-insert.html), [Firebird] (http://www.firebirdsql.org/file/documentation/reference_manuals /reference_material/html/langrefupd25-insert.html#langrefupd25-insert-returning))는 [UPDATE OR INSERT']에서도'INSERT ... RETURNING columnname [, columnname]'과 같은 것을 지원합니다 (http : // www. firebirdsql.org/file/documentation/reference_manuals/reference_material/html/langrefupd25-update-or-insert.html) –

+0

@MarkRotteveel 당신 말이 맞아요. 이 질문은 태그가 붙어있는 방식이기 때문에 MySQL에 관해 주로 말하고있었습니다. 하지만 그에 대한보다 정확한 답변을 편집 할 것입니다. –

0

는 사실, INSERT가 ... 중복 키 UPDATE가 현재 상황에서 사용할 수있는 권리 문은 정확히 : 당신이 UNIQUE 열이 있기 때문에


다음은 "해결 방법"간단합니다. ON DUPLICATE를 사용하면 삽입없이 중복되지 않으면 JDBC는 1의 개수와 새로 삽입 된 행의 ID를 반환합니다. 수행 된 조치가 복제로 인한 갱신 인 경우, 새 ID가 실제로 테이블에 삽입되지 않더라도 JDBC는 2의 계수와 원래 행의 ID와 새로 생성 된 ID를 리턴합니다.

PreparedStatement.getGeneratedKeys()를 호출하여 올바른 키를 얻을 수 있습니다. 첫 번째 열쇠는 거의 항상 당신이 관심있는 하나이 문장의 경우 :.

INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=3; 

당신은 삽입 또는 ID를 업데이트받을 수 있습니다 호출하여 : 당신이 검색 할 "필요합니까 무엇에 대한

Long key; 
ResultSet keys = preparedStatement.getGeneratedKeys(); 
if (keys.next()) 
    key = keys.getLong("GENERATED_KEY"); 
관련 문제