Informix : Serial/Serial8 기본 키로 행을 삭제하면 어떻게됩니까?

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

  •  10-07-2019
  •  | 
  •  

문제

Informix DB의 기본 키에 사용 된 일련의 데이터 유형에 대한 빠른 질문이있었습니다.

행을 삭제하면 직렬 키가 계산 중입니까, 아니면 삭제 된 행에 대해 다시 조정됩니까?

따라서 현재 행이 직렬 번호 5 인 경우, 숫자 행을 삭제하여 Serial No 3을 삭제하고 다음 값은 6이고 계속 계속됩니까? 이제 다시 사용되지 않도록 영원히 잃어버린 직렬 번호 3입니까?

도움이 되었습니까?

해결책

Serial, Serial8 또는 Bigserial에 의해 사용되는 카운터는 주위를 감싸기 전까지 단조롭게 증가하고 있습니다. 삭제 된 값은 간단히 삭제됩니다. 카운터보다 큰 문자 값을 삽입하면 카운터가 조정되어 다음 삽입 된 값이 하나 더 커집니다.

CREATE TABLE s (s SERIAL(2) NOT NULL PRIMARY KEY, v VARCHAR(20) NOT NULL);

INSERT INTO s(s,v) VALUES(0, "Row 2");
INSERT INTO s(s,v) VALUES(0, "Row 3");
INSERT INTO s(s,v) VALUES(0, "Row 4");
INSERT INTO s(s,v) VALUES(0, "Row 5");
DELETE FROM s WHERE s = 3;
INSERT INTO s(s,v) VALUES(0, "Row 6");
INSERT INTO s(s,v) VALUES(8, "Row 8"); -- Skip 7
INSERT INTO s(s,v) VALUES(0, "Row 9");

SELECT * FROM s ORDER BY s;

결과를 생성합니다.

          2     Row 2
          4     Row 4
          5     Row 5
          6     Row 6
          8     Row 8
          9     Row 9

모든 유형은 비슷하게 행동합니다. 최대 값 (직렬의 경우 2^32-1, Serial8 및 Bigserial의 경우 2^63-1)에 도달하면 카운터가 다시 0으로 감싸지만, 비상장 공간이 재사용되고 1 차 키가 거부되는 문제가 발생할 수 있습니다. 중복 행. 일반적으로 포장하지 마십시오. (특히 64 비트 카운터를 포장하는 데 꽤 시간이 걸립니다.)

3 또는 7과 같은 '누락 된'값을 수동으로 삽입 할 수 있습니다. 그러나 ID는 귀하를 위해이를 수행하지 않습니다.

@IQ 질문 :

그렇다면 Informix는 사용하지 않거나 삭제 된 직렬 값이 랩핑 될 때 자동으로 재사용됩니까?

설마. 값은 1으로 되돌아갑니다. 값 1이있는 행이 존재하면 삽입이 실패합니다. 그렇지 않으면 성공합니다. 어느 쪽이든, 다음 시도는 2. 마지막 예제가 중단 된 곳을 계속 설명하기 위해 시도 할 것이다.

INSERT INTO s(s,v) VALUES(2147483647, "Row 2,147,483,647");
INSERT INTO s(s,v) VALUES(0, "Row next")     { 1 - Pass };
INSERT INTO s(s,v) VALUES(0, "Row next + 1") { 2 - Fail };
INSERT INTO s(s,v) VALUES(0, "Row next + 2") { 3 - Pass };
INSERT INTO s(s,v) VALUES(0, "Row next + 3") { 4 - Fail };
SELECT * FROM s ORDER BY s;

최종 결과는 다음과 같습니다.

          1     Row next            
          2     Row 2               
          3     Row next + 2        
          4     Row 4               
          5     Row 5               
          6     Row 6               
          8     Row 8               
          9     Row 9               
 2147483647     Row 2,147,483,647   

분명히, 다음 세 삽입물은 실패하고, 하나는 성공하고, 2 개가 더 실패하고, 다음 수십억 개의 인서트에서 성공할 것입니다.

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