SQL 쿼리를 준비하기 위해 PreparedStatement를 사용하고 있습니다. 내가 존재하지 않는 경우에만 테이블에 행을 삽입하고 싶습니다.행이 존재하지 않는 경우에만 삽입
INSERT INTO users (userId) VALUES (?) ON DUPLICATE KEY UPDATE userId = ?
하지만이 불필요 사용자 ID를 업데이트합니다 -
나는이 시도.여기에 userId
을 삽입 할 수 있습니까?
SQL 쿼리를 준비하기 위해 PreparedStatement를 사용하고 있습니다. 내가 존재하지 않는 경우에만 테이블에 행을 삽입하고 싶습니다.행이 존재하지 않는 경우에만 삽입
INSERT INTO users (userId) VALUES (?) ON DUPLICATE KEY UPDATE userId = ?
하지만이 불필요 사용자 ID를 업데이트합니다 -
나는이 시도.여기에 userId
을 삽입 할 수 있습니까?
INSERT INTO users
(userId)
SELECT ?
WHERE NOT EXISTS
(
SELECT *
FROM users
where userId = ?
)
당신은
INSERT IGNORE INTO users (userId) VALUES (?)
을 사용할 수있다 그러나 당신이 오류를 무시할까요 왜 을 이해해야합니다.
오류를 무시하지 않는 것이 좋습니다. 그들은 무시하는 대신 처리해야합니다. –
@LuiggiMendoza. 나는 보통 그것이 처리되어야 함을 이해한다. 그러나 행이 존재할 때 정말로 아무것도 할 필요가 없다면'catch {do nothing}'이라고 쓰려고 할 것인가? – RiaD
나는 예외를 처리 할 것이다. 이는 결과가 응용 프로그램에 어떤 영향을 미치는지에 따라 달라집니다. 예를 들어 사용자가 데이터를 입력하고 저장하려고하면 응용 프로그램에 * Sorry, dup 항목 * 또는 뭔가 (물론 공식적인 메시지를 사용합니다)와 같은 메시지가 표시됩니다. 인턴 과정이라면 적어도 예외를 기록한 다음해야 할 일에 대한 전략을 게시 할 것입니다 : 프로세스를 멈추고 경고 등을 계속하십시오 ... –
중복 키가 테이블이 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 주입 문제와 더 많은 기능과 데이터베이스에 대한 단 하나의 호출.
제 테이블은'innodb'입니다 : ( – XTop
그렇다면 먼저 행의 존재를 확인하는 다른 선택권이 없습니까? –
데이터베이스에서 중복 키에 대한 예외를 리턴하고 처리하도록하십시오. –
찾으시는 키워드는'UPSERT'입니다. – OldCurmudgeon