복붙노트

[SQL] 간극없이 시퀀스를 생성 POSTGRESQL

SQL

간극없이 시퀀스를 생성 POSTGRESQL

나는 / 송장에 대해 고유 한 ID를 만들 수 있어야합니다. 나는 테이블 ID와이 고유 번호에 대한 또 다른 열이. 나는 직렬화 격리 수준을 사용합니다. 사용

  var seq = @"SELECT invoice_serial + 1 FROM  invoice WHERE ""type""=@type ORDER BY invoice_serial DESC LIMIT 1";

그것은 직렬화 수준으로 정확한 값을 읽을 실 거예요에도 FOR UPDATE를 사용하기 때문에 도움이되지 않습니다.

유일한 해결책은 일부 재시도 코드를 삽입하는 것 같다.

해결법

  1. ==============================

    1.시퀀스 숫자의 차이가없는 세트를 생성하지 않으며,이를 만드는 방법은 정말이 없기 때문에 롤백 또는 오류 것 "사용"일련 번호 그렇게.

    시퀀스 숫자의 차이가없는 세트를 생성하지 않으며,이를 만드는 방법은 정말이 없기 때문에 롤백 또는 오류 것 "사용"일련 번호 그렇게.

    나는 얼마 전에 이것을에 기사를 썼다. 그것은 오라클에 지시하지만 차이가없는 숫자의 기본 원칙에 대해 정말, 나는 같은 여기에 적용 생각합니다.

    insert into
      invoices
        (
        invoice#,
        ...)
    with curr as (
      select Coalesce(Max(invoice#)) max_invoice#
      from   invoices)
    select
      curr.max_invoice#+rownum,
      ...
    from
      tmp_invoice
      ...
    

    원래 기사

  2. ==============================

    2.당신도 삽입에 테이블을 잠금 및 / 또는 재시도 코드가 필요합니다. 사용 가능한 다른 옵션이 없습니다. 당신은 일어날 수있는 일에 대해 생각 중지하는 경우 :

    당신도 삽입에 테이블을 잠금 및 / 또는 재시도 코드가 필요합니다. 사용 가능한 다른 옵션이 없습니다. 당신은 일어날 수있는 일에 대해 생각 중지하는 경우 :

    그 이유를 확인할 수 있습니다.

  3. ==============================

    3.그런 다음, 아니 캐시 시퀀스를 생성 순서에서 다음 값을 얻을하고 카운터로 있음을 사용할 수 있습니다.

    그런 다음, 아니 캐시 시퀀스를 생성 순서에서 다음 값을 얻을하고 카운터로 있음을 사용할 수 있습니다.

    CREATE SEQUENCE invoice_serial_seq START 101 CACHE 1;
    SELECT nextval('invoice_serial_seq');
    

    여기에 더 많은 정보

  4. ==============================

    4.2006 년에, 누군가가 PostgreSQL의 메일 링리스트에 끊김없는 시퀀스 솔루션을 게시 : http://www.postgresql.org/message-id/44E376F6.7010802@seaworthysys.com

    2006 년에, 누군가가 PostgreSQL의 메일 링리스트에 끊김없는 시퀀스 솔루션을 게시 : http://www.postgresql.org/message-id/44E376F6.7010802@seaworthysys.com

  5. from https://stackoverflow.com/questions/19004453/postgresql-generate-sequence-with-no-gap by cc-by-sa and MIT license