는 불행하게도 나는 어떻게이 질문의 이름을 더 좋은 생각이 없다, 그래서 당신은 더 나은이있는 경우 제안/원에 업데이트 가서 삽입하려고 할 때 나는이 방법을 사용하고있다 년 이후RDBM - 일대일 -> 항목이 있는지 확인하고 삽입/업데이트하거나 항상 삭제하고 삽입 만 하시겠습니까?
:-) 편집 - one resource : DELETE
을 수행하여 그러한 PK가있는 행이없는 것을 확인한 다음 INSERT
만 수행하십시오. 나는 항상 이것이 성능과 단순성 모두를위한 최선의 사례라고 생각했습니다. DB 및 응용 프로그램 계층 (즉, DELETE
쿼리를 실행하면 SELECT
을 실행하고 결과를 확인하는 것보다 비용이 적게 드는 것처럼 보입니다. 데이터가 양방향으로 전송되는 것을 고려할 때도 마찬가지입니다).
그러나 물론 다른 방법은 INSERT ... ON DUPLICATE KEY UPDATE ...
, IF EXISTS (SELECT ...) UPDATE ... ELSE INSERT...
또는 UPDATE ... ;IF ROWCOUNT = 0 INSERT ...
처럼 (기본 RDBMS에 따라) 및 응용 프로그램 계층에서 동일하게 수행 물론, 즉 먼저 확인을 항목이 있는지 여부와 그것이 UPDATE
을 수행 않는 경우가 있습니다 , INSERT
을 수행하거나 UPDATE
을 수행하고 영향을받는 행의 수를 확인한 다음 0이 아니면 INSERT
[UPDATE
이 기본 리소스를 변경하지 않으면 영향을받는 행 수로 0을 반환하므로 INSERT
은 다음을 반환합니다. 중복 PK 오류] ...
나는 무엇이 최선의 방법인지 궁금하다. 최선의 방법은 성능, 모범 사례 등을 고려하는 경우입니다.
확인을 특히에 대해 이야기 할 때, 나에게 합리적인 것 같다 공연. 그것은 하나의 배경을 가지고 있습니다 - 문을 준비하고 나서 * 모든 변수를 매개 변수로 제공하면서 * 실행 *하는 경우에 대비하여 '중복 키 업데이트'를 사용하여 복제해야합니다. 20 대신 10 매개 변수 ...하지만 성능을 목표로하므로 조금 더 입력하면 가치가 있습니다 :-) – shadyyx
@shadyyx 입력 횟수를 두 배로 늘릴 수있는 몇 가지 방법을 추가했습니다. 코드에 대한 감사합니다. – Bohemian
샘플,하지만 내 경우에는 (GoLang) 별도의 매개 변수 (예 :'stmt.setParam()'가 아니라'exec()'(예 :'stmt)로 전달하여 명명 된 매개 변수가 완전히 다른 해결책을 가져야합니다. Exec (param1, param2, param3, ..., paramX)'). 그렇지만, 단순히'array'를'slice'에 넣고,'stmt.Exec (params ...)'(말 그대로이 세개의 점들)처럼 전달할 수 있습니다. 그럼에도 불구하고 'INSERT ... DUPLICATE KEY UPDATE ...'명령은 ** REST PUT **에 어떻게 부합합니까? - 즉 리소스가 PUT 요청으로 대체됩니다. – shadyyx