수열 중간에 숫자가 몇 개 빠지면 마음이 매우 불편해지는 사람들이 있다.
데이타베이스 기술에 대한 이해나 확신이 부족하여, 빠진 이빨을 맞추려고 함.
틈을 발견했을 때 대다수 사람들의 반응은 틈을 메우고 싶어 한다는 것이다.
시퀀스 중에 사용하지 않은 값을 찾아서 입력하기
이 방법 역시 두 애플리케이션이 동시에, 사용되지 않은 가장 작은 값을 찾으려 하면
한쪽에선 에러가 발생한다.
SELECT b1.bug_id + 1
FROM Bugs b1
LEFT OUTER JOIN Bugs AS b2 ON (b1.bug_id + 1 = b2.bug_id)
WHERE b2.bug_id IS NULL
ORDER BY b1.bug_id LIMIT 1;
기존 행에 대한 키 값을 업데이트해 틈을 메우고 모든 값을 연속이 되도록 할 수 있다고 생각함
동시 업데이트 시, 충돌 우려, 부모-자식 관계 시, 복잡한 업데이트 절차 필요
UPDATE Bugs SET bug_id = 3 WHERE bug_id = 4;
PK 값을 재사용을 자제 하자 ( PK 업데이트 포함 )
가상키 값을 바꿔야 할 이유는 없다.
가상키 값은 아무런 의미도 가지지 말아야 한다.
PK 칼럼의 값이 어떤 의미를 가진다면 그건 자연키(natural key)지 가상키가 아니다.
PK 값은 유일하고 NULL 이 아니어서 각 행을 참조한느 데 사용할 수 있어야 한다.
이게 전부다. 행을 식별하는 데 연속적인 숫자일 필요는 없다.
ROW_NUMBER() 를 활용 ( ROWNUM )
SELECT t1.* FROM
(SELECT a.account_name, b.bug_id, b.summary,
ROW_NUMBER() OVER (ORDER BY a.account_name, b.date_reported) AS rn
FROM Accounts a JOIN Bugs b ON (a.account_id = b.reported_by)) AS t1
WHERE t1.rn BETWEEN 51 AND 100;
CREATE TABLE Bugs (
bug_id UNIQUEIDENTIFIER DEFAULT NEWID(), summary varchar(100) );
INSERT INTO Bugs (bug_id, summary) VALUES (DEFAULT, 'crashes when I save');
select bug_if from Bugs
==> 48D4D3F8-D323-4E90-A56B-1B852BE86EBC
커뮤니케이션 문제지 기술적 문제가 아니다.