복붙노트

[SQL] MySQL은 삭제 후 자동 증가

SQL

MySQL은 삭제 후 자동 증가

나는에 AUTO_INCREMENT이있는 기본 키 필드 MySQL의 테이블을 가지고있다. 여기에 다른 게시물을 읽은 후 나는 같은 문제와 다양 답변 주목 사람들을했습니다. 일부는 다른 사람들이 '고정'이 될 수없는 상태,이 기능을 사용하지 않는 것이 좋습니다.

나는 가지고있다:

table: course
fields: courseID, courseName

예 : 테이블의 레코드 수 : 18 만약 내가 삭제 기록을 16, 17, 18 - 내가 마지막으로 입력 courseID 18 살 때문에 그러나 그것은 19 것, (16)의 courseID을 가지고 입력 한 다음 레코드를 기대.

내 SQL 지식은 놀라운 것이 아니라 새로 고치거나 쿼리 (또는 phpMyAdmin을 인터페이스에서 설정)이 카운트를 업데이트 할 어쨌든 무엇입니까?

이 테이블은 데이터베이스에서 다른 사람과 관련됩니다.

모든 조언을 감안할 때,이 '문제'를 무시하기로 결정했습니다. 나는 단순히 삭제하고의 일을 증가 자동을시키는 동안 레코드를 추가합니다. 나는 정말에만 고유 식별자로 사용되고하고 (위에서 언급 한 바와 같이) 사업의 의미를 가지고 있지 않기 때문에 숫자가 무엇인지는 중요하지 않습니다 같아요.

내 원래의 게시물과 혼동했을 수 있습니다 사람들을 위해 : 나는 얼마나 많은 기록을 알고이 필드를 사용하지 않으. 난 그냥 깔끔한 모양과 좀 더 일관성을 가지고있는 데이터베이스를 원했다.

해결법

  1. ==============================

    1.그 AUTO_INCREMENT의 사용 목적이 아니다 당신은, 소리가 위험한 일을하려고하는지.

    그 AUTO_INCREMENT의 사용 목적이 아니다 당신은, 소리가 위험한 일을하려고하는지.

    당신이 정말로 가장 낮은 사용되지 않는 키 값을 찾으려면, 전혀 AUTO_INCREMENT를 사용하여 수동으로 키를 관리하지 않습니다. 그러나 이것은 권장되는 방법이 아닙니다.

    스텝 백을 가지고 물어 "당신이 키 값을 재활용해야하는 이유는 무엇입니까?" 서명되지 않은 INT (또는 BIGINT)는 충분히 큰 키 공간을 제공하지 않아?

    당신은 정말 응용 프로그램의 수명의 과정을 통해보다 18,446,744,073,709,551,615 고유 한 기록이 건가요?

  2. ==============================

    2.

    ALTER TABLE foo AUTO_INCREMENT=1
    

    가장 최근의 항목을 삭제 한 경우, 그 다음 가장 낮은 하나를 사용하도록 설정해야합니다. 한 이미 더 (19)이 없다로서, 마찬가지로, 16-18을 삭제하면 (16)를 사용할 수있는 자동 증가 재설정됩니다.

    편집 : 나는 phpMyAdmin에 대한 비트를 놓쳤다. 당신도 거기를 설정할 수 있습니다. 테이블 화면으로 이동하여 작업 탭을 클릭합니다. 당신이 설정할 수 있습니다 거기에 자동 증가 필드가있어 어떤 수동 필요는 없다.

  3. ==============================

    3.데이터베이스의 기본 자동 증가 키는 고유 지정된 행을 식별하는 데 사용됩니다 및 모든 비즈니스 의미를 부여 할 수 없습니다. 그래서있는 그대로 기본 키를두고 예를 들어 courseOrder을 요구 다른 열을 추가합니다. 데이터베이스에서 레코드를 삭제하면 다음 당신은 당신이 현재 삭제하는 것보다 courseOrder의 이상을 가진 모든 행의 courseOrder 열을 감소하기 위해 추가 UPDATE 문을 보낼 수 있습니다.

    데이터베이스의 기본 자동 증가 키는 고유 지정된 행을 식별하는 데 사용됩니다 및 모든 비즈니스 의미를 부여 할 수 없습니다. 그래서있는 그대로 기본 키를두고 예를 들어 courseOrder을 요구 다른 열을 추가합니다. 데이터베이스에서 레코드를 삭제하면 다음 당신은 당신이 현재 삭제하는 것보다 courseOrder의 이상을 가진 모든 행의 courseOrder 열을 감소하기 위해 추가 UPDATE 문을 보낼 수 있습니다.

    외래 키로 참조하고 참조 제한 조건을 위반할 수 수정 다른 테이블이있을 수 있기 때문에 보조 노트로서 당신은 관계형 데이터베이스의 기본 키의 값을 수정해서는 안됩니다.

  4. ==============================

    4.시도 :

    시도 :

    즉, autoincremented 값을 재설정하고 새로운 값이 생성되는 동안 다음 모든 행을 계산합니다.

    예 : 전

    표의 배열을 표시하므로 : 1,2,4,5-을

    예 : AFTER (이 명령을 사용하면 당신이 얻을 것이다)

    삭제 된 값의 흔적, 그리고 증가 된 나머지이 새로운 수를 계속합니다.

    그러나

  5. ==============================

    5.당신은 당신이 테이블에 얼마나 많은 레코드를 알려하기 위해 AUTO_INCREMENT 아이디에 의존해서는 안된다. 당신은 코스 SELECT COUNT (*)를 사용한다. ID 년대 그래서 당신은해야하지, 거기에 고유 물론 그것을 식별하고 다른 테이블에서 참조로 사용할 수 있습니다 반복 식별자이며, 자동 증가 필드를 재설정 추구해서는 안된다.

    당신은 당신이 테이블에 얼마나 많은 레코드를 알려하기 위해 AUTO_INCREMENT 아이디에 의존해서는 안된다. 당신은 코스 SELECT COUNT (*)를 사용한다. ID 년대 그래서 당신은해야하지, 거기에 고유 물론 그것을 식별하고 다른 테이블에서 참조로 사용할 수 있습니다 반복 식별자이며, 자동 증가 필드를 재설정 추구해서는 안된다.

  6. ==============================

    6.그렇게 같은 ID를 선택할 수 있습니다 :

    그렇게 같은 ID를 선택할 수 있습니다 :

    set @rank = 0;
    select id, @rank:=@rank+1 from tbl order by id
    

    그 결과 식별자들의리스트이고, 상기 시퀀스에서의 위치.

    당신은 또한과 같이 ID를 재설정 할 수 있습니다 :

    set @rank = 0;
    update tbl a join (select id, @rank:=@rank+1 as rank from tbl order by id) b
      on a.id = b.id set a.id = b.rank;
    

    당신은 또한 너무처럼 사용되지 않은 첫 번째 ID를 출력 할 수 있습니다 :

    select min(id) as next_id from ((select a.id from (select 1 as id) a
      left join tbl b on a.id = b.id where b.id is null) union
      (select min(a.id) + 1 as id from tbl a left join tbl b on a.id+1 = b.id
      where b.id is null)) c;
    

    각 삽입 후, 당신은 AUTO_INCREMENT를 재설정 할 수 있습니다 :

    alter table tbl auto_increment = 16
    

    삽입을 할 때 또는 명시 적으로 id 값을 설정합니다 :

    insert into tbl values (16, 'something');
    

    일반적으로이 필요하지 않습니다, 당신은 COUNT (*) 및 결과 세트의 순위 번호를 생성 할 수 있습니다. 일반적인 순위는 다음과 같을 수 있습니다 :

    set @rank = 0;
    select a.name, a.amount, b.rank from cust a,
      (select amount, @rank:=@rank+1 as rank from cust order by amount desc) b
      where a.amount = b.amount
    

    양에 의해 평가 고객 보냈다.

  7. ==============================

    7.나는 제목 질문에 대한 답을 찾고 여기 온 "MySQL의 - 삭제 한 후 자동 증가"하지만 난 단지 질문에 그것에 대한 답을 찾을 수

    나는 제목 질문에 대한 답을 찾고 여기 온 "MySQL의 - 삭제 한 후 자동 증가"하지만 난 단지 질문에 그것에 대한 답을 찾을 수

    같은 것을 사용하여 :

    DELETE FROM table;
    ALTER TABLE table AUTO_INCREMENT = 1;
    

    대린 디미트로프의 대답은 정말 잘 AUTO_INCREMENT과 그것의 사용을 설명합니다. 당신은 후회할 일을하기 전에가보세요.

    PS : 질문 자체가 더? "당신이 재활용 키 값을해야하는 이유" 그리고 돌프의 대답은 커버.

  8. ==============================

    8.난 당신이 특히 마이그레이션 또는 개발 과정에서이 작업을 수행해야 할 수도 있습니다 시나리오를 충분히 생각할 수 있습니다. 예를 들어, 내가 지금 (복잡한 설정 과정의 일환으로) 기존의 두 테이블을 교차 결합하여 새로운 테이블을 작성했고, 나는 이벤트 후 기본 키를 추가 할 필요가 있었다. 당신은 기존 기본 키 열을 삭제 한 후이 작업을 수행 할 수 있습니다.

    난 당신이 특히 마이그레이션 또는 개발 과정에서이 작업을 수행해야 할 수도 있습니다 시나리오를 충분히 생각할 수 있습니다. 예를 들어, 내가 지금 (복잡한 설정 과정의 일환으로) 기존의 두 테이블을 교차 결합하여 새로운 테이블을 작성했고, 나는 이벤트 후 기본 키를 추가 할 필요가 있었다. 당신은 기존 기본 키 열을 삭제 한 후이 작업을 수행 할 수 있습니다.

    ALTER TABLE my_table ADD `ID` INT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (`ID`);
    

    라이브 시스템의 경우, 그것은 좋은 생각이 아니며, 외래 키가 가리키는 다른 테이블이있다 특히.

  9. ==============================

    9.나는 아주 단순하지만 교묘 한 방법을 얻었다.

    나는 아주 단순하지만 교묘 한 방법을 얻었다.

    행을 삭제하는 동안, 당신은 다른 임시 테이블에 ID를 보존 할 수 있습니다. 그 후, 때 당신은 당신이 검색하고 임시 테이블에서 ID를 선택할 수 있습니다 메인 테이블에 새로운 데이터를 삽입합니다. 그래서 여기에 검사를 사용합니다. 임시 테이블이 더 ID가없는 경우, 메인 테이블에 최대 ID를 계산하고 새로운 ID를 설정 : NEW_ID old_max_ID = + 1이다.

    NB : 당신은 여기에 자동 증가 기능을 사용할 수 없습니다.

  10. ==============================

    10.당신이 일을하려고하는 것은 매우 위험합니다. 주의 깊게 생각해보십시오. 자동 증가의 기본 동작에 대한 아주 좋은 이유가있다.

    당신이 일을하려고하는 것은 매우 위험합니다. 주의 깊게 생각해보십시오. 자동 증가의 기본 동작에 대한 아주 좋은 이유가있다.

    이걸 고려하세요:

    A 레코드를 다른 테이블과 관계가 하나 개의 테이블에서 삭제됩니다. 두 번째 테이블의 해당 레코드는 감사의 이유로 삭제할 수 없습니다. 이 기록은 첫 번째 테이블에서 고아가된다. 새 레코드가 첫 번째 테이블에 삽입되며, 순차적 기본 키를 사용하는 경우,이 기록은 이제 고아에 연결되어 있습니다. 분명히, 이것은 나쁘다. 자동을 사용하여 PK, 항상 보장되기 전에 사용 된 적이없는 ID를 증가. 이 방법은 고아가 정확한지, 고아로 남아있다.

  11. ==============================

    11.그 문제를 해결하는 방법이 실제로있다. 먼저 당신은 auto_incremented 기본 키 열을 삭제 한 다음 당신은 다음과 같이 다시 추가 :

    그 문제를 해결하는 방법이 실제로있다. 먼저 당신은 auto_incremented 기본 키 열을 삭제 한 다음 당신은 다음과 같이 다시 추가 :

    ALTER TABLE table_name DROP column_name;
    ALTER TABLE table_name ADD column_name int not null auto_increment primary key first;
    
  12. ==============================

    12.기본 키가 필요한 레코드를 삭제 한 후부터 시작해야하는 위치를 지정할하기 위해 MySQL의 클라이언트 소프트웨어 / 스크립트를 사용할 수 있습니다.

    기본 키가 필요한 레코드를 삭제 한 후부터 시작해야하는 위치를 지정할하기 위해 MySQL의 클라이언트 소프트웨어 / 스크립트를 사용할 수 있습니다.

  13. ==============================

    13.당신은 당신이 자동 증가의 가치와 당신이보고 싶어 무엇처럼 보이지 않는 모든 행의 ID 값을 업데이트 할 수 있도록 삭제 후 트리거를 만드는 방법에 대한 생각.

    당신은 당신이 자동 증가의 가치와 당신이보고 싶어 무엇처럼 보이지 않는 모든 행의 ID 값을 업데이트 할 수 있도록 삭제 후 트리거를 만드는 방법에 대한 생각.

    당신이 행을 삭제할 때마다보기 자동 해결 될 것 같은 테이블과 자동 증가와 함께 작동 할 수 있도록 트리거는 그것을 수정합니다.

  14. ==============================

    14.그 확실히 추천 할 수 없습니다. 당신이 여러 테이블에 큰 데이터베이스가있는 경우, 당신은 테이블 하나를 재 배열하면 당신은 아마 표 2에서 ID로 사용자 ID를 저장 한 후, 아마 의도 된 사용자 ID는 의도 된 테이블이 ID 끝나게하지 않습니다.

    그 확실히 추천 할 수 없습니다. 당신이 여러 테이블에 큰 데이터베이스가있는 경우, 당신은 테이블 하나를 재 배열하면 당신은 아마 표 2에서 ID로 사용자 ID를 저장 한 후, 아마 의도 된 사용자 ID는 의도 된 테이블이 ID 끝나게하지 않습니다.

  15. ==============================

    15.

    if($id == 1){ // deleting first row
                mysqli_query($db,"UPDATE employees  SET id=id-1 WHERE id>1");
            }
            else if($id>1 && $id<$num){ // deleting middle row
                mysqli_query($db,"UPDATE employees  SET id=id-1 WHERE id>$id");
            }
            else if($id == $num){ // deleting last row
                mysqli_query($db,"ALTER TABLE employees AUTO_INCREMENT = $num");
            }
            else{
                echo "ERROR";
            }
    
            mysqli_query($db,"ALTER TABLE employees AUTO_INCREMENT = $num");
    
  16. ==============================

    16.여기에 귀하의 문제를 해결하는 기능입니다

    여기에 귀하의 문제를 해결하는 기능입니다

        public static void fixID(Connection conn, String table) {
    
        try {
            Statement myStmt = conn.createStatement();
            ResultSet myRs;
            int i = 1, id = 1, n = 0;
            boolean b;
            String sql;
    
            myRs = myStmt.executeQuery("select max(id) from " + table);
            if (myRs.next()) {
                n = myRs.getInt(1);
            }
            while (i <= n) {
                b = false;
                myRs = null;
                while (!b) {
                    myRs = myStmt.executeQuery("select id from " + table + " where id=" + id);
                    if (!myRs.next()) {
                        id++;
                    } else {
                        b = true;
                    }
                }
    
                sql = "UPDATE " + table + " set id =" + i + " WHERE id=" + id;
                myStmt.execute(sql);
                i++;
                id++;
            }
    
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    
  17. from https://stackoverflow.com/questions/2214141/auto-increment-after-delete-in-mysql by cc-by-sa and MIT license