삭제 후 SQL Server에서 자동 증분 재설정
SQL Server 데이터베이스의 테이블에서 일부 레코드를 삭제했습니다.
표의 ID는 다음과 같습니다.
99 100 101 1200 1201...
이후 레코드(IDs > 1200)를 삭제한 다음 자동 생성된 ID가 102가 되도록 자동 증분을 재설정하고 싶습니다.그래서 제 레코드는 순차적입니다. SQL Server에서 이 작업을 수행할 수 있는 방법이 있습니까?
다음 명령을 실행하여 1에서 시작하도록 테이블을 다시 정렬합니다.
DBCC CHECKIDENT (mytable, RESEED, 0)
이에 대한 자세한 내용은 Books on Line(BOL, SQL 도움말)에서 확인하십시오.또한 설정 중인 시드보다 높은 레코드가 없는 것도 주의해야 합니다.
DBCC CHECKIDENT('databasename.dbo.tablename', RESEED, number)
숫자 = 0이면 다음 삽입 시 자동 증분 필드에 값 1이 포함됩니다.
숫자 = 101이면 다음 삽입 시 자동 증분 필드에 값 102가 포함됩니다.
추가 정보...할 수도 있습니다.
자동 증분을 제공하기 전에number
쿼리에서 에 위쿼에기테의자블동증분열다작에음은다값합다니보다 작은 값이 되어 있는지 .number
.
테이블(table1)에서 열의 최대값(columnn_name)을 가져오려면 다음 쿼리를 사용할 수 있습니다.
SELECT MAX(column_name) FROM table1
세미 백치 방지:
declare @max int;
select @max = max(key) from table;
dbcc checkident(table,reseed,@max)
http://sqlserverplanet.com/tsql/using-dbcc-checkident-to-reseed-a-table-after-delete
MySQL을 사용하는 경우 다음을 시도합니다.
ALTER TABLE tablename AUTO_INCREMENT = 1
난 이해했다.다음과 같습니다.
DBCC CHECKIDENT ('tablename', RESEED, newseed)
데이터베이스의 모든 테이블을 삭제하고 다시 정렬합니다.
USE [DatabaseName]
EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all" -- Disable All the constraints
EXEC sp_MSForEachTable "DELETE FROM ?" -- Delete All the Table data
Exec sp_MSforeachtable 'DBCC CHECKIDENT(''?'', RESEED, 0)' -- Reseed All the table to 0
Exec sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all" -- Enable All the constraints back
-- You may ignore the errors that shows the table without Auto increment field.
승인된 답변을 기준으로 전체 스키마 자격을 갖춘 유사한 문제가 발생한 사용자의 경우:
([MyDataBase].[MySchemaName].[MyTable]
합니다. DB의. 해당 DB의 컨텍스트에 있어야 합니다.
즉, 다음과 같은 경우 오류가 발생합니다.
DBCC CHECKIDENT ([MyDataBase].[MySchemaName].[MyTable], RESEED, 0)
대신 전체 테이블 이름을 작은 따옴표로 묶습니다.
DBCC CHECKIDENT ('[MyDataBase].[MySchemaName].[MyTable]', RESEED, 0)
다음과 같은 문장을 사용할 것을 권장하는 몇 가지 답변이 있습니다.
DBCC CHECKIDENT (mytable, RESEED, 0)
그러나 OP는 "일부 레코드를 삭제했다"고 말했는데, 이는 모든 레코드가 아닐 수 있으므로 0의 값이 항상 올바른 것은 아닙니다.다른 답변에서는 최대 전류 값을 자동으로 찾아서 해당 값으로 다시 시드하는 것이 제안되었지만 테이블에 레코드가 없으면 문제가 발생하므로 max()가 NULL을 반환합니다. 단순을 사용하여 제안된 의견
DBCC CHECKIDENT (mytable)
값을 재설정하기 위해, 그러나 다른 의견은 이것이 테이블에 이미 있는 최대값으로만 값을 증가시킬 뿐이며, OP가 원하는 테이블의 최대값보다 이미 높은 경우에는 값을 감소시키지 않습니다.
더 나은 해결책은 이러한 아이디어를 결합합니다.첫 번째 CHECKIDENT는 값을 0으로 재설정하고, 두 번째 CHECKIDENT는 테이블에 레코드가 있을 경우 테이블에서 현재 가장 높은 값으로 재설정합니다.
DBCC CHECKIDENT (mytable, RESEED, 0)
DBCC CHECKIDENT (mytable)
여러 주석에서 알 수 있듯이 삭제된 레코드를 가리키는 외부 키가 다른 테이블에 없는지 확인합니다.그렇지 않으면 이러한 외래 키는 테이블을 다시 시드한 후 작성한 레코드를 가리킵니다. 이는 거의 확실히 사용자가 염두에 두고 있던 것이 아닙니다.
저는 이 답변을 추가하고 싶습니다. 왜냐하면DBCC CHECKIDENT
테이블에 스키마를 사용할 때 문제가 발생합니다.이를 통해 다음 사항을 확인합니다.
DECLARE @Table AS NVARCHAR(500) = 'myschema.mytable';
DBCC CHECKIDENT (@Table, RESEED, 0);
작업의 성공 여부를 확인하려면 다음을 사용합니다.
SELECT IDENT_CURRENT(@Table);
할 수 것은 '으으으으으으으으으으으으으으으으으으으으'입니다.0
위의 예에서
일반적으로 이 작업을 수행하지 않을 수 있습니다.다시 시드를 사용하면 데이터 무결성 문제가 발생할 수 있습니다.모든 테스트 데이터를 삭제하고 다시 시작하는 개발 시스템에서만 사용할 수 있습니다.모든 관련 레코드가 삭제되지 않은 경우(외부 키 관계에 있어야 하는 모든 테이블이!인 것은 아님) 프로덕션 시스템에서 사용해서는 안 됩니다.이 작업을 수행하면 엉망진창이 될 수 있으며, 특히 삭제할 때마다 정기적으로 작업을 수행해야 하는 경우에는 더욱 그렇습니다.ID 필드 값의 차이를 걱정하는 것은 좋지 않습니다.
이건 어때요?
ALTER TABLE `table_name`
MODIFY `id` int(12) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=0;
이것은 자동 증분을 0 또는 원하는 숫자로 빠르게 변경할 수 있는 간단한 방법입니다.데이터베이스를 내보내고 직접 코드를 읽음으로써 이 사실을 알게 되었습니다.
또한 다음과 같이 작성하여 단일 줄 솔루션으로 만들 수 있습니다.
ALTER TABLE `table_name` MODIFY `id` int(12) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=0;
데이터베이스의 모든 키를 마지막으로 가장 높은 키의 최대값에서 자동 증분으로 재설정하려면:
Exec sp_MSforeachtable 'DBCC CHECKIDENT(''?'', RESEED, 0)'
Exec sp_MSforeachtable 'DBCC CHECKIDENT(''?'', RESEED)'
SQL 서버에서 원하는 시퀀스로 시작하도록 기본 키/시퀀스를 재설정하려면 다음과 같은 솔루션이 있습니다.
ID:
99 100 101 1200 1201...
- ID > = 1200 행을 드롭합니다. (이들에 외부 키 제약조건이 연결되어 있으며 이를 삭제하기 위해서도 처리하거나 삭제해야 하는 경우 주의하시기 바랍니다.)
- 이제 MAX ID를 알고 있어야 합니다.
@max_id를 int =(_table에서 MAX(your_columnn_name)+1로 선언합니다.
(참고: +1은 최대값 이후에 ID 시퀀스를 시작합니다.)
- 시퀀스를 다시 시작합니다.
exec(실행) 시퀀스 your_column_name restart(+@max_id);
(참고: 사용 후 공백 필요) 이제 새 레코드는 ID로 102로 시작합니다.
이것이 오래된 질문이라는 것을 압니다.그런데 MySQL과 비슷한 솔루션을 찾고 있었는데 이 질문이 나왔습니다.
MySQL 솔루션을 찾는 사용자는 다음 쿼리를 실행해야 합니다.
// important!!! You cannot reset the counter to a value less than or equal to the value that is currently in use. For both InnoDB and MyISAM, if the value is less than or equal to the maximum value currently in the AUTO_INCREMENT column, the value is reset to the current maximum AUTO_INCREMENT column value plus one.
ALTER TABLE <your-table-name> AUTO_INCREMENT = 100
언급URL : https://stackoverflow.com/questions/510121/reset-autoincrement-in-sql-server-after-delete
'programing' 카테고리의 다른 글
ASP의 컨트롤러에서 이진 파일을 반환하는 중입니다.NET 웹 API (0) | 2023.05.06 |
---|---|
비주얼 스튜디오에서 이클립스의 Ctrl+클릭? (0) | 2023.05.06 |
Excel에서 날짜 시간을 표시하는 방법 (0) | 2023.05.06 |
열 유형을 변경하고 null이 아님을 설정합니다. (0) | 2023.05.06 |
기본 제약 조건을 추가하는 명령 (0) | 2023.05.01 |