SQL (Firebird/MySQL)에서 레코드를 업데이트/삽입하는 올바른/빠른 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/343562

  •  19-08-2019
  •  | 
  •  

문제

데이터베이스에서 레코드를 업데이트하고 그렇지 않을 때 삽입하려면 SQL이 필요합니다. 주변을 둘러 보는 것은 이것에 대한 몇 가지 솔루션이있는 것처럼 보이지만,이를 수행하는 올바른/ 수용 방법이 무엇인지 모르겠습니다.

업데이트는 두 데이터베이스에 대해 업데이트를 실행해야하므로 Firebird 2와 MySQL 5에서 모두 작동하는 것이 이상적입니다. 동일한 SQL이 두 데이터베이스에서 더 많은 데이터베이스에서 작동하는 경우 두 가지 모두에서 동일한 SQL이 실행되면 더 단순합니다. .

속도와 신뢰성은 또한이 경우 속도에 대한 신뢰성을 고려하지만 잠재적으로 1000의 레코드를 빠르게 연속적으로 업데이트하는 데 사용됩니다 (다른 테이블에 대한).

하위 요법이 있습니까?

도움이 되었습니까?

해결책

다음과 같은 것을 사용해야합니다.

BEGIN TRANSACTION
IF EXISTS (SELECT * FROM the_table WHERE pk = 'whatever')
    UPDATE the_table SET data = 'stuff' WHERE pk = 'whatever'
ELSE
    INSERT INTO the_table (pk, data) VALUES ('whatever', 'stuff')
COMMIT

또는 이것을하지만 별도로 보내고 1 차 주요 제약 조건 위반에 대한 인서트의 오류를 무시합니다.

INSERT INTO the_table (pk, data) VALUES ('whatever', 'stuff')

UPDATE the_table SET data = 'stuff' WHERE pk = 'whatever'

다른 팁

Firebird 2.1에서 사용할 수 있습니다 업데이트 또는 삽입 간단한 경우 또는 병합 보다 복잡한 시나리오.

MySQL의 경우 시도해보십시오 REPLACE 명령: http://dev.mysql.com/doc/refman/5.0/en/replace.html

(Firebird의 동등한 사항에 대해서는 Milan Babuskov 의이 답변에 대한 의견을 참조하십시오.)

2.1 이전의 Firebird에서는이 까다로운 방법을 사용할 수 있습니다.

insert into table (id, a, b, c) values (:id, :a, :b, :c)
when SQLCODE -803 
do
begin
  update table set a = :a, b = :b, c = :c where id = :id;
end;

테이블의 기존 행이 기본 키 또는 고유 한 인덱스의 새 행과 동일한 값을 갖는 경우 새 행이 삽입되기 전에 이전 행이 삭제된다는 점을 제외하고 삽입과 같은 작업을 정확하게 교체하십시오.

구문 :

low_priority | 지연] [tbl_name에] [(col_name, ...)

{ VALUES | VALUE} 

({expr | DEFAULT},...),(...),...

반면 : 제약으로 작업 할 때 교체를 피하는 것이 가장 좋습니다.

삽입물을 사용했습니다 MySQL 다음과 같이 행을 업데이트하려면 :
INSERT INTO table () VALUES () ON DUPLICATE KEY UPDATE key
그러나 자동 생성 키를 사용할 수 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top