2015-01-01 8 views
0

필자는 Sequel (4.x) 및 MySQL 5.5를 사용하여 쓰기가 많은 응용 프로그램에서 주로 INSERT을 수행하고 때로는 기존 행을 업데이트합니다. 후속 조치는 .insert() 작업 후에 AUTO_INCREMENT ID를 반환합니다.후속 키 업데이트를 사용하여 Sequence가 항상 자동 증가 ID를 반환하도록 할 수 있습니까?

나는 현재와 같은 식으로 .on_duplicate_key_update()을 사용하고 있습니다 :

# Insert new row into cache_table, updating any columns that change 
# on a key violation 
id = DB[:table_name].on_duplicate_key_update.insert(
  col1: @col1, 
  col2: @col2, 
  created: nil, 
  updated: nil 
) 

이은 행이 새로 삽입되는 변수 id에 자동 증가 ID (LAST_INSERT_ID()) 또는 열의 값이 변경,하지만 수익을 반환 0 열의 값이 수정되지 않은 경우

읽는 중 MySQL docs 이유를 이해합니다. MySQL INSERT...ON DUPLICATE KEY UPDATE을 수행 할 때, MySQL은 에 의해 이미 존재하지만 변경되지 않은 행의 AUTO_INCREMENT id를 안정적으로 반환 할 수 없습니다. 난 정말이 특정 응용 프로그램에서 추가 SELECT을 피하고자

ON DUPLICATE KEY UPDATE `id` = LAST_INSERT_ID(`id`) 

: 워드 프로세서와 같은 UPDATE 표현을 사용하는 것이 좋습니다. 어떻게 Sequel이 동일한 동작을 사용하도록 강제 할 수 있으며 실제 변경 사항이 없어도 항상 행 id을 반환합니까?

답변

1

그것은 속편 사용 RDBMS의 기능을 실행시키는 것이 가능하다 Sequel.function() method

MySQL의 네이티브 LAST_INSERT_ID()을 실행하고, 인수로서 열 id 합격, 두 번째 인수로 심볼로 열 이름을 통과 :

Sequel.function(:last_insert_id, :id) 

Dataset#on_duplicate_key_update method은 업데이트에 대한 열 및 새 값의 해시를 받아, 그래서 :last_insert_id 기능을 업데이트 할 다른 컬럼의 명시 적 목록과 함께이 전달 될 수 있습니다

id = DB[:table_name].on_duplicate_key_update(
    # Call the native LAST_INSERT_ID() 
    id: Sequel.function(:last_insert_id, :id), 
    col1: @col1, 
    col2: @col2, 
    updated: nil 
).insert(
    col1: @col1, 
    col2: @col2, 
    created: nil, 
    updated: nil 
) 

이 방법은 안정적으로 SELECT 쿼리를 할 필요없이, idLAST_INSERT_ID()를 반환합니다.

: INSERT...ON DUPLICATE KEY UPDATE 테이블이 AUTO_INCREMENT 기본 키 외에 추가 UNIQUE 인덱스를 포함하는 경우 행이 업데이트 될 때 사전에 테이블의 AUTO_INCREMENT 값의 원인이됩니다. 이는 Sequel에만 국한되는 것이 아니라 ON DUPLICATE KEY UPDATE을 사용할 때의 일반적인 경고입니다.

허용되지 않는 경우 DB.insert()0 인 경우 대신 id를 검색하는 대신 별도의 SELECT을 수행해야 할 수 있습니다.