2009-03-19 4 views
6

연락처를 저장하는 SQL 데이터베이스를 만들고 있습니다. 연락처를 삭제할 수 있기를 원하며 각 연락처에 대한 올바른 ID는 내 소프트웨어에 연결하는 데 중요합니다. 내가 제임스에게 연락하고 그가 처음이다라고 말하게한다. 그의 id는 0입니다. 나는 Mary를 추가하고 id는 1입니다. James를 지우면, Mary의 id를 1로 유지하는 대신에 0으로 설정할 수 있습니까? 그녀는 지금 처음으로 리셋해야합니다. 즉, 누군가가 삭제되면 어떻게 데이터베이스의 모든 ID를 재설정 할 수 있습니까? 고마워요SQL Server의 ID 열 재설정

+0

정확히 이것을 수행 하시겠습니까? 출품 순서대로 보관해야하는 경우 날짜 기록을 남기거나 순위를 유지하기 위해 기둥을 추가 할 수 있습니다. – achinda99

+2

질문을 Upvoting. OP가하려고하는 것이 좋지 않다는 것에 동의하는 반면, 질문은 초심자 프로그래머가하지 말아야 할 이유와 이유에 대한 좋은 표식입니다. 많은 upvotes를 얻는 응답은 그 문제를 아주 잘 해결해 주며 매우 유익합니다. – JohnFx

+0

시동기에는 일반적인 실수입니다. ID가 없어지면 성장 속도를 늦추 길 원합니다. –

답변

3

자동 증가 기본 키 열에서이 작업을 수행하는 것은 의미가 없습니다. 관련 테이블의 대량 업데이트없이 사용자가 데이터 무결성에 영향을 미치지 않는 한 간단합니다. 이렇게하려면 열에서 인덱스와 기본 키 제약 조건을 삭제하고 나중에 모든 레코드의 번호를 다시 매기고 모든 관련 테이블의 번호를 다시 지정한 다음 기본 키 제약 조건 및 인덱스를 다시 적용해야 할 가능성이 높습니다.

항상 0에서 시작하는 선형 식별자가 있어야하는 경우 (그러면 소프트웨어 설계에 문제가 있음을 나타낼 수 있음) 기본 키 외에도 보조 ID 열을 가질 수 있습니다. 같은 구문 렁을 높은 값을 임의 재생하기 :

UPDATE table 
SET secondaryID = secondaryID - 1 
WHERE secondaryID > (SELECT secondaryID FROM table WHERE primaryID = [id to delete]); 

DELETE FROM table 
WHERE primaryID = [id to delete]; 

내가 강하게 연습을 억제 - 당신의 ID를 때문에 삭제 된 레코드의 값은 소프트웨어가 아니라이 값의 존재 여부를 테스트한다 '실종'하는 경우 그냥 밖으로 wigging보다.

6

일단 당신이 데이터베이스에 사소한 양의 레코드를 가지고 있으면 그 속도가 느려질 것입니다. ID 컬럼은 당신을 위해 작동하지 않을 것입니다. 모든 숫자를 계속 변경하려면 사용자 정의 tsql을 할 필요가 있습니다. 그러나 아주 나쁜 생각입니다.

추가 된 순서를 추적해야하는 경우 날짜/시간 스탬프를 사용하지 않는 이유는 무엇입니까?

디자인을 다시 생각해야합니다.

2

ID를 단순한 식별자 이상으로 사용하고 있습니다. 이 경우 자동 증가 필드를 사용할 수 없습니다. 코드에서이를 처리해야합니다.

5

ID가 작동하는 방식이 아니라 작동 방식이 아닙니다. ID는 변경해서는 안되며, 연결된 모든 정보는 잘못된 행을 가리 킵니다.

대신, 사용자가 제어하는 ​​"External_ID"열을 추가하지 않으시겠습니까? 또는 쿼리에 동적으로 번호를 지정하십시오 (계산 열 포함)

16

이렇게 많은 점에서 좋지 않습니다. 이 일을하는 법을 보여 주면 논쟁 중입니다. 행의 ID가 설정된 후에는 행의 ID를 변경해야합니다.

아마도 PK 식별자로 잘못된 필드를 사용하고 있다면. 나는 당신이 신원 칼럼 인 당신의 PK 필드에 대해서 이야기하고 있다는 가정을하고 있습니다.

연락처 테이블에 연결할 테이블을 만들고 ID를 변경하기 시작하면 모든 테이블을 업데이트해야합니다. 어느 것이 비싸 질지 ...

3

이것은 행이 삭제 될 때마다 ID 열의 번호를 다시 매기는 것보다 다른 방법을 사용하여 훨씬 더 잘 해결 될 것입니다.

응용 프로그램에이 기능이 필요한 이유를 알지 못하면 무엇을 할 것인지 정확히 말하기 어렵지만 응용 프로그램에서이 기능을 필요로한다는 사실은 아마도 어딘가에 디자인 문제가 있음을 나타낼 수 있습니다.

4

ID는 고유 식별자입니다.

행을 다른 테이블의 다른 행에 연결하는 데 사용할 수 있습니다. ID가 없다는 것은 그것이 삭제되었다고 분명히 말하기 때문에 정보 자체도 포함합니다. ID 번호를 재활용하기 시작하면 고유 한 식별자를 사용한다는 목적을 완전히 상실하게되며 실제로 의미가 없습니다. ID가 행에 할당되면 임의로 변경하면 안됩니다.

누군가가 죽으면 사회 보장 번호 (ID)를 다른 사람에게 양도하는 경우를 상상해보십시오. 그로 인해 사망 한 사람의 사회 보장 번호와 연결된 모든 오래된 정보를 그 새로운 사람에게 이전하게되는데, 이는 아무 의미가 없습니다. 동일한 ID가 발생하면 ID가 다시 할당되면 이전에 연결된 이전 데이터를 상속합니다.

0

나는 다중 레벨 영업 프로그램을 처리 할 응용 프로그램을 작성했습니다. 물론 사람들은 빠져 나간다. 우리의 경우에도 사람들이 삽입되어야했습니다.

한 번 수정하면 제대로 돌아갑니다.

신원 번호 (ID)와 일련 번호 (seq)는 서로 다른 두 가지입니다. 그들은 서로 전혀 관계가 없습니다.

ID를 변경하지 마십시오. 일단 할당되면 항상 할당됩니다.

시퀀스에 대해 테이블에 열 (cNEXT)을 만들고 ID로 채 웁니다. "이 시퀀스의 다음 ID는 무엇입니까?"

언제든지 cNEXT를 재 할당하여 cNEXT에서 ID를 임의로 섞으십시오. 저장된 proc은 모든 작업을 수행 할 수 있습니다.

그런 다음 ID의 비 연속적인 체인을 만들 수도 있습니다. 사람들이 다른 지역으로 이동하거나 또는 다른 그룹으로 프로모션을 올릴 때 유용합니다.

희망이 도움이됩니다. :)

1

1 분 Google 검색에서 표시 할 수없는 페이지를 제공했습니다. Google this and it is this first link to 6/1/2009 : tsql fix "identity column"

본질적으로 모든 관계형 필드 사이에 외래 키 제약 조건을 해당 ID 필드에 추가하는 것이 좋습니다 어떤 리 넘버링을하기 전에 (어떤 관계가 있다면 끔찍한 생각이다. 엄격히 말해서이 질문을한다면 엄격한 시간을 갖기 때문이다.)

연락처 테이블이 유일한 테이블이거나이 ID 필드를 기반으로 ZERO 관계가있는 경우 Identity 속성을 NO로 설정하고 값을 1에서 COUNT (ID)로 다시 지정한 다음 Identity 속성을 YES로 설정하고, 그리고 사용 완료 ID를 시드 :

DECLARE @MaxID INT

SELECT @MaxID = COUNT (ID)를

테이블 ID

DBCC CHECKIDENT ('테이블 ID'RESEED, @MaxID) 행 이 시나리오에서는 추가 삽입 또는 외국 이전에 각 삭제 집합 후에 위의 시드 된 스크립트를 사용합니다 (그러나 처음에 올바르게 설정 되었으면 COUNT (ID)를 MAX (ID)로 변경하고 테이블이 커질수록 약간의 속도가 추가됨). 키 제약 조건 업데이트. 삭제 및 재 시드 블록을 감싸는 TRANSACTIONS를 사용하고 테이블이 동기 트랜잭션 만 허용하는지 확인하십시오. 이렇게하면 재 시드의 중간에 데이터가 유출되지 않습니다.

Complex eh? 이것이 바로 오른발에서 시작하는 것이 가장 좋은 이유입니다. ;) (나는 이것을 경험에서 배웠다.) 더 이상의 질문이 있으면 mraarone et yahoo d0t com에 전자 메일을 보내라.

0

모든 답변은 프로덕션 환경이라고 가정합니다. 당신의 데이터베이스 디자인을 테스트하는 경우, 신속하게 모든 테이블을 절단 할 것은이 작업을 수행하는 쉬운 방법이 있어야한다 :

DBCC CHECKIDENT ({테이블 이름}, 0, 시드)

* 모든 행을 삭제 ID를 먼저 사용하는 모든 테이블