데이터베이스에서 삭제 된 레코드의 수치 기본 키가 향후 새 레코드에 대해 재사용됩니까?

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

문제

예를 들어 자동 수립 필드가있는 경우이 필드를 지정하지 않고 새 레코드를 추가하고 DB 엔진을 선택하도록합니다.
그렇다면 삭제 된 레코드의 수를 선택합니까? 그렇다면 언제?

// SQL Server, MySQL. //

후속 질문 : DB 엔진이 기본 키에 사용할 숫자가 부족하면 어떻게됩니까?

도움이 되었습니까?

해결책

아니. 수치 기본 키는 수동으로 지정하는 것을 제외하고는 재사용되지 않습니다 (실제로 피해야합니다!)

다른 팁

Afaik, 이것 ~할 수 있었다 MySQL에서 발생합니다.

InnodB에서 Auto_increment 처리가 어떻게 작동하는지:

InnoDB는 서버가 실행되는 한 메모리 인 메모리 자동 증가 카운터를 사용합니다. 서버가 중지되고 다시 시작되면 innodb는 앞에서 설명한대로 테이블에 첫 번째 삽입에 대한 각 테이블의 카운터를 다시 구입합니다.

서버를 다시 시작한 후. innodb 재사용 이전에 생성 된 auto_increment 값.:

제안 된 수정 : InnoDB 테이블은 다시 시작한 후 auto_increment 열에 대한 다음 번호의 트랙을 잃어서는 안됩니다.

자동 번호 시스템에 따라 다릅니다. 어떤 종류의 시퀀스를 사용하는 경우, 시퀀스에 대해 알지 못하기 때문에 삭제 된 레코드의 수는 재사용되지 않습니다.

일반적으로 숫자는 재사용되지 않습니다.

그러나 Oracle과 같은 제품에서 주위를 순환하고 숫자를 재사용하는 시퀀스 생성기를 지정할 수 있습니다.

그것들이 삭제 된 레코드의 수에 관계없이 응용 프로그램의 문제입니다.

이 질문은 더 정확하게 만들어야합니다.

... "오라클 시퀀스와"

... "MySQL Autonumber Columns"

... 등...

테이블을 올바르게 만드는 한 숫자를 재사용하지 않습니다. 그러나 다음을 사용하여 Identity Column (MSSQL에서)을 재조정 할 수 있습니다.

- 사용할 다음 번호가 아닌 테이블에 마지막 유효한 항목의 번호를 입력하십시오.

DBCC Checkident ([TableName], Reseed, [numberyouwanttostartat]))

이것은 물론 미쳤습니다 ... 절대로 끝나지 않아야합니다 :)

MySQL은 귀하가 아니라면 ID를 재사용하지 않습니다 truncate 테이블 또는 delete from 아니오가있는 테이블 where 절 (이 경우 MySQL은 내부적으로 단순히 truncate).

구체적으로 아닙니다. 키를 시퀀스 또는 자동화 아이덴티티 열에서 읽는 경우 시퀀스는 다음 값을 따라 꽂고 생성됩니다. 그러나 이것을 비활성화 할 수 있습니다 (set identity_insert on SQL Server)에서 고유성 제약을 위반하지 않는 한 원하는 숫자를 열에 넣습니다.

예, 실제로 ID를 생성하는 방식에 달려 있습니다.

예를 들어 Guid를 기본 키로 사용하는 경우 무작위 새 GUID를 얻는 대부분의 구현은 다시 다른 GUID를 선택하지 않을 가능성이 높지만 충분한 시간이 주어지고 GUID가 표에 있지 않으면 삽입 문이 진행됩니다. 괜찮지 만 이미 안내가 있다면 주요 주요 제약 조건 위반을 받게됩니다.

ID를 재사용하는 MySQL "기능"은 버그를 고려합니다.

파일 업로드 처리와 같은 것을 고려하십시오. 데이터베이스 ID를 파일 이름으로 사용하는 것이 좋습니다. 간단하고 사용자가 제공하는 파일 이름 등으로 악용 될 위험이 없습니다.

파일 시스템이 관련 될 때 모든 것을 트랜잭션으로 만들 수는 없습니다 ... 데이터베이스 트랜잭션을 커밋 한 다음 파일을 작성하거나 파일을 작성하고 데이터베이스 트랜잭션을 커밋해야하지만 하나 또는 둘 다 실패한 경우 충돌 또는 네트워크 파일 시스템에는 적합성이 있으므로 데이터베이스에 유효한 레코드가 있고 파일이 없거나 데이터베이스 레코드가없는 파일이 없을 수 있습니다.

이러한 문제가 발생하고 다시 돌아올 때 서버가 가장 먼저하는 일은 ID를 덮어 쓰고, 따라서 롤백 트랜잭션의 파일을 덮어 쓰는 것입니다. 이러한 파일은 유용했을 수 있습니다.

아니요, 귀하의 은행이 귀하의 Account_id를 재사용하기로 결정했다고 상상해보십시오. -Arghhhh !!

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