복붙노트

[SQL] PostgreSQL의 SERIAL 작업 다르게합니까?

SQL

PostgreSQL의 SERIAL 작업 다르게합니까?

나는 SERIAL ID로 포스트 그레스의 테이블이 있습니다.

id (serial) name age

삽입은 일반적으로 웹 응용 프로그램에서 발생합니다.

나는 **** 최대 (ID)와 같은 ID를 설정 수동으로 두 개의 새로운 기록 하나를 삽입

웹 응용 프로그램은이 기록을 삽입 할 때이 두 삽입 후에는 중복 키 오류를 제공합니다.

그냥 2 개 레코드. 그 모든 작품 벌금 후.

문제는 - 왜 내 수동 삽입 시리얼을 증가하지 않았다?

자동 증가 및 직렬는 다르다 있습니까?

내가 무슨 말이냐? 마 MySQL의 또는 다른 SQL은 동일한 문제가?

해결법

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

    1.직렬 또는 BIGSERIAL 열을 만들 때, PostgreSQL는 실제로 세 가지 작업을 수행합니다 :

    직렬 또는 BIGSERIAL 열을 만들 때, PostgreSQL는 실제로 세 가지 작업을 수행합니다 :

    직렬 열을 지정하지 않고 값을 삽입 할 때 (당신이 명시 적으로 값으로 DEFAULT를 지정하는 경우 나)의 순서에 호출됩니다 NEXTVAL :

    수동으로 시리얼 컬럼에 대해 기본값이 아닌 값을 제공하면 다음 순서는 업데이트 및 NEXTVAL 캔 반환 값 일련 열이 이미 사용되지 않습니다. 당신이 이런 종류의 작업을 수행한다면, 당신은 수동으로 NEXTVAL 또는 setval에 호출하여 순서를 수정해야합니다.

    시리얼 열 격차가 + 1은 동시성 문제가되지 않은 경우에도 좋은 아이디어 아닙니다 최대 (ID)를 사용하여 이렇게 예상 할 수있다, 그래서 또한 기록이 삭제 될 수 있음을 유의하십시오.

    당신은 직렬 또는 BIGSERIAL를 사용하는 경우, 가장 좋은 건 그냥 일이 그들이있는 거 불투명 번호가 특정 순서로 나올 것을 당신을 위해 값을 할당하는 PostgreSQL을 돌봐를하자 척하는 것입니다 그들에게 자신을 할당하지 않습니다 고유성이 아닌 그들에 대해 아무것도 생각하지 않습니다. 엄지 손가락이 규칙은 IMO 모든 데이터베이스에 적용됩니다.

    MySQL의의 AUTO_INCREMENT는 다른 데이터베이스 유형 그러나 아마 미세 수동 의지 도움말 모두와 함께 작동하는 방법 나는 확실하지 않다.

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

    2.시리얼 열이있는 테이블에 레코드를 삽입 할 경우 - 단지 쿼리에서 그것을 인정 - 자동으로 생성됩니다.

    시리얼 열이있는 테이블에 레코드를 삽입 할 경우 - 단지 쿼리에서 그것을 인정 - 자동으로 생성됩니다.

    또는 당신은 같은과 기본 값을 삽입 할 수 있습니다 :

    insert into your_table(id, val)
    values (default, '123');
    

    세 번째 옵션은 malually 직접 직렬 순서에서 값을하는 것입니다 :

    insert into your_table(id, val)
    values (nextval(pg_get_serial_sequence('your_table','id')), '123');
    
  3. ==============================

    3.이러한 접근 방식은 완전히 잘못하고 데이터베이스에서 작동하지 않습니다. 그것은 단지 순전히 운에 의해 MySQL은 지금까지 당신을 위해 일합니다.

    이러한 접근 방식은 완전히 잘못하고 데이터베이스에서 작동하지 않습니다. 그것은 단지 순전히 운에 의해 MySQL은 지금까지 당신을 위해 일합니다.

    두 개의 연결을 동시에 이것을 실행하면, 그들은 동일한 ID를 얻을 수 있습니다. 동시에 대한 테이블이 하나의 연결 만이 한 번에 ID를 받고있을 수 있습니다 그래서 읽기 잠금 경우에만 안정적으로 작동 할 수 있습니다.

    또한 몹시 비효율적이다.

    서열이 존재하는 이유는 안정적으로 동시 인서의 존재에 ID를 얻을 수 있도록이있다.

    그냥 사용 :

    INSERT INTO my_table(data1, data2) VALUES ('a','b') RETURNING id;
    

    또는:

    INSERT INTO my_table(id, data1, data2) VALUES (DEFAULT, 'a','b') RETURNING id;
    

    DEFAULT 테이블 정의에서 해당 열의 기본값을 얻기 위해 데이터베이스에게 특별한 장소 홀더이다. 다음 시퀀스 값이 삽입 얻을 것이다, 그래서 기본값은 ( 'my_table_id_seq')의 nextval입니다.

    당신이 순서에 대한 기본적인 질문을하고 있기 때문에, 당신은 또한 서열이되지 끊김없는 것을 고려하는 것이 좋습니다. 시퀀스는 테이블 값 가서 "구멍"을 가지고하는 것이 정상 1, 3, 4, 5, 9, 10, ....

  4. from https://stackoverflow.com/questions/18389537/does-postgresql-serial-work-differently by cc-by-sa and MIT license