2013-05-18 4 views
1

SQL 쿼리를 준비하기 위해 PreparedStatement를 사용하고 있습니다. 내가 존재하지 않는 경우에만 테이블에 행을 삽입하고 싶습니다.행이 존재하지 않는 경우에만 삽입

INSERT INTO users (userId) VALUES (?) ON DUPLICATE KEY UPDATE userId = ? 

하지만이 불필요 사용자 ID를 업데이트합니다 -

나는이 시도.

여기에 userId을 삽입 할 수 있습니까?

+2

데이터베이스에서 중복 키에 대한 예외를 리턴하고 처리하도록하십시오. –

+0

찾으시는 키워드는'UPSERT'입니다. – OldCurmudgeon

답변

2
INSERT INTO users 
     (userId) 
SELECT ? 
WHERE NOT EXISTS 
     (
     SELECT * 
     FROM users 
     where userId = ? 
     ) 
+0

IDK,하지만 당신은 upvotes을 얻지 못해서 어떤 것이 더 나은 접근인지 알 수 없습니다 ... 당신의 대답이나 다른 하나는 _RiaD_입니까? – XTop

+0

내 대답에 더 복잡한 SQL이 있습니다. RiaD의 대답은 자동으로 변환 오류를 무시합니다. 두 가지 모두에 대해 할 말이 있습니다. – Andomar

+1

@Andomar. . . 나는 이것이 표준 SQL이라는 것을 당신의 호의에 첨가 할 것이다. –

1

당신은

INSERT IGNORE INTO users (userId) VALUES (?) 

을 사용할 수있다 그러나 당신이 오류를 무시할까요 왜 을 이해해야합니다.

+1

오류를 무시하지 않는 것이 좋습니다. 그들은 무시하는 대신 처리해야합니다. –

+0

@LuiggiMendoza. 나는 보통 그것이 처리되어야 함을 이해한다. 그러나 행이 존재할 때 정말로 아무것도 할 필요가 없다면'catch {do nothing}'이라고 쓰려고 할 것인가? – RiaD

+0

나는 예외를 처리 할 것이다. 이는 결과가 응용 프로그램에 어떤 영향을 미치는지에 따라 달라집니다. 예를 들어 사용자가 데이터를 입력하고 저장하려고하면 응용 프로그램에 * Sorry, dup 항목 * 또는 뭔가 (물론 공식적인 메시지를 사용합니다)와 같은 메시지가 표시됩니다. 인턴 과정이라면 적어도 예외를 기록한 다음해야 할 일에 대한 전략을 게시 할 것입니다 : 프로세스를 멈추고 경고 등을 계속하십시오 ... –

0

중복 키가 테이블이 innodb 인 경우 제대로 작동하지 않습니다. 그것은 당신이 묘사하고있는 문제를 정확하게 생성합니다. innodb의 기능이 필요하다면 먼저 행의 존재 여부를 확인해야합니다. 그렇지 않으면 테이블을 myisam 테이블로 변환 할 수 있습니다.

편집 : 삽입 또는 업데이트를 결정하기 전에 행의 존재를 확인해야하는 경우 저장 프로 시저를 사용하도록 조언합니다.

DELIMITER // 
CREATE PROCEDURE adjustusers(IN pId int) 
BEGIN 
DECLARE userid int; 
    select count(id) into userid from users where id = pId; 
    if userid = 1 then 
    update users set id = pId where id = pId; 
    else 
    insert into users(id) values(pId); 
    end if; 
END // 
DELIMITER ; 

저장 프로 시저가 준비된 문과 마찬가지로 사전 컴파일됩니다. 따라서 SQL 주입 문제와 더 많은 기능과 데이터베이스에 대한 단 하나의 호출.

+0

제 테이블은'innodb'입니다 : ( – XTop

+0

그렇다면 먼저 행의 존재를 확인하는 다른 선택권이 없습니까? –

관련 문제