2014-04-26 1 views
1

ID 증가 기능을 사용하는 기본 키 열이있는 기존 테이블이 있습니다. 새로운 레코드가 생성 될 때 자동 증가 열에 다른 번호를 붙일 수 있도록 어떻게 든 열을 업데이트하는 방법이 있습니까? 예를 들어 생성 된 다음 레코드가 기본 키 450016을 생성하는 경우 접두어 13을 사용하여 DB에 저장되는 최종 결과가 13450016이됩니다.자동 증분 열 앞에 숫자를 붙이는 방법

+1

그리고 왜 이것을하고 싶습니까? –

+0

여기에 귀하의 옵션에 대한 토론이 있습니다. http://www.sqlteam.com/article/custom-auto-generated-sequences-with-sql-server – Gavin

+0

접두어를 붙이려면 ID 값의 마지막 두 자리가 필요합니다. 자릿수 앞에 붙일 수 있습니까? – RajeshKannan

답변

0

항상 동일한 번호가 접두어로 있어야하기 때문에 다시 시드 할 수 없습니다. 제가해야 할 일은 제안 된 것들이 혼합 된 것입니다.내가 할 일은 기본 키 열의 이름을 바꾸고 새 열을 만들고 이전 기본 키 열의 이름에 이름을 지정한 다음 ID 값이 무엇이든 새 열 값을 업데이트하는 트리거를 추가하는 것입니다 지정된 번호 접두사. 내 주요 문제 중 하나는 내 기본 키 열 이름을 참조하는 코드가 너무 많아서 이름을 바꿔 이름을 변경해야한다는 것입니다. 모두에게 감사드립니다!

1

"나는 새로운 계산 된 열을 만드는 대신 ID 열을 실제로 조작하는 방법 "이라고 설명했습니다.

신원 열은 꽤 완고합니다. 이런 식으로하고 싶다면 모든 것을 새로운 테이블에 복사하는 것이 가장 좋습니다. 13을 접두어로 붙이려면, 실제로하고있는 일은 존재하는 모든 것에 13000000을 더하고 거기에서부터 세는 것입니다.

CREATE TABLE tbl (ID INT IDENTITY,Val INT) 
INSERT INTO tbl VALUES (1),(1) 

SELECT * FROM tbl 

CREATE TABLE tbl2 (ID INT IDENTITY,Val INT) 

SET IDENTITY_INSERT tbl2 ON 

INSERT INTO tbl2 (ID,val) 
     SELECT ID+1300000, Val 
     FROM tbl WITH (HOLDLOCK TABLOCKX) 

SET IDENTITY_INSERT tbl2 OFF 

DROP TABLE tbl 

EXECUTE sp_rename N'tbl2', N'tbl', 'OBJECT' 

SELECT * FROM tbl 

INSERT INTO tbl VALUES (1),(1) 
SELECT * FROM tbl 

DROP TABLE tbl 

경우, 대신 당신은 그냥 그대로 존재하는 모든 것을 떠나 만들기 위해 신원을 시드하려면 다음 13xxxxxx에서 다음 레코드 별이 대신 당신은 다시 시드 할 수 있습니다

CREATE TABLE tbl (ID INT IDENTITY,Val INT) 
INSERT INTO tbl VALUES (1),(1) 

SELECT * FROM tbl 

DBCC CHECKIDENT ('tbl', RESEED, 1300002); 

INSERT INTO tbl VALUES (1),(1) 
SELECT * FROM tbl 

DROP TABLE tbl 

이 할 수 있다면 여러번 있지만 접미사가 항상 시드 값을 늘려야하므로 뒤로 이동할 수 없습니다.

(1) 기타 테이블이 기본 키를 참조하지 않는 당신이 행 (숫자가 순차적)이 삭제되지 않은 :

0

은 어쩌면 수 있습니다 4 가지 방법이 있습니다. (2) 다른 테이블은이 기본 키를 참조하지 않지만 숫자는 순차적이지 않습니다 (행이 삭제되었습니다). (3) 숫자는 순차적이지만 다른 테이블은이 기본 키를 참조합니다. (4) 참조 및 삭제 된 행이 모두 있습니다.

이러한 방법으로 열을 교체 할 수 있습니다. 는 그러나 테이블의 이름 (당신이 바로 데이터베이스에있어 확인과 TABLENAME을 교체하고 작은 따옴표를 유지대로

EXEC sp_fkeys 'tablename' 

코드를 사용하여 테이블에이 chex를 실행하는

시도 점수).

이 저장 프로 시저에 표시된 행이 있으면 외래 키 제약 조건을 일시적으로 삭제해야합니다. FK_Name 컬럼을 참조하고이 컬럼에있는 값을 나열하십시오. 행을 생성하는 경우 예를 알려주십시오.

그런 다음 다음 코드를 실행합니다 : 그것은하지만 우리가 작업중인 실제 열 이름으로 NAME_OF_ID_COLUMN을 교체하고 열이있는 테이블의 이름 TABLE_NAME 교체 될 때

SELECT TOP 1 NAME_OF_ID_COLUMN - ROW_NUMBER()OVER(ORDER BY ID) AS NSEQ 
FROM TABLE_NAME ORDER BY NSEQ DESC 

코드를 사용합니다.

NSEQ 열의 값이 0이면 삭제하지 않은 경우, 1이면 삭제됩니다.

원할 경우 의견에 답을 알려 주시면 관련 코드를 정렬 해 드리겠습니다.