복붙노트

[SQL] MySQL의에서 다음 사용 가능한 ID를 찾기

SQL

MySQL의에서 다음 사용 가능한 ID를 찾기

내가 MySQL 데이터베이스에서 (데이터베이스 (5 개) 데이터가있는 경우, 내가 6 인 사용 가능한 다음 삽입 위치를 얻을 수 있습니다) 다음 사용 가능한 ID를 찾을 수있다. 내가 어떻게 할 수 있습니까? 나는 MAX (ID)를 사용했다,하지만 난 데이터베이스에서 일부 행을 삭제할 때, 그것은 여전히 ​​업데이트되지 않은 이전의 최대 값을 보유하고 있습니다.

해결법

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

    1.누군가가 당신이 다음 ID를 요청 직후에 새로운 행을 삽입 할 수 있기 때문에 나는 당신이 이제까지 다음 ID에 확신 할 수 있다고 생각하지 않습니다. 당신은 적어도 거래를해야하고, 내가 잘못 아니에요 경우에만 그것을 처리하는 일반적인 방법은 적어도 그것을 삽입 한 후 사용되는 실제 ID를 얻을 수 있습니다 - 참조 http://dev.mysql.com/ 문서 / 그러면, refman / 5.0 / EN / 점점 고유-id.html

    누군가가 당신이 다음 ID를 요청 직후에 새로운 행을 삽입 할 수 있기 때문에 나는 당신이 이제까지 다음 ID에 확신 할 수 있다고 생각하지 않습니다. 당신은 적어도 거래를해야하고, 내가 잘못 아니에요 경우에만 그것을 처리하는 일반적인 방법은 적어도 그것을 삽입 한 후 사용되는 실제 ID를 얻을 수 있습니다 - 참조 http://dev.mysql.com/ 문서 / 그러면, refman / 5.0 / EN / 점점 고유-id.html

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

    2.업데이트 2014년 12월 5일 : 나는 때문에 사이먼의 (가능) 대답뿐만 아니라 샌디에고의 코멘트에 배치 이유로이 방법을 추천하고 있지 않다. 책임 아래 쿼리를 사용하십시오.

    업데이트 2014년 12월 5일 : 나는 때문에 사이먼의 (가능) 대답뿐만 아니라 샌디에고의 코멘트에 배치 이유로이 방법을 추천하고 있지 않다. 책임 아래 쿼리를 사용하십시오.

    내가 MySQL의 개발자 사이트에서 발견 가장 짧은 하나

    SELECT Auto_increment FROM information_schema.tables WHERE table_name='the_table_you_want'
    

    당신은 같은 테이블에 몇 데이터베이스가있는 경우과 같이뿐만 아니라 데이터베이스 이름을 지정해야합니다, 당신을 마음 :

    SELECT Auto_increment FROM information_schema.tables WHERE table_name='the_table_you_want' AND table_schema='the_database_you_want';
    
  3. ==============================

    3.루카스 Lysik의 대답에 추가 - 종류의 SQL의 LEFT-가입하세요. 내가 알고있는 것처럼, 경우 ID의이 : 1,2,4,5는 3을 반환해야합니다.

    루카스 Lysik의 대답에 추가 - 종류의 SQL의 LEFT-가입하세요. 내가 알고있는 것처럼, 경우 ID의이 : 1,2,4,5는 3을 반환해야합니다.

    SELECT u.Id + 1 AS FirstAvailableId
    FROM users u
    LEFT JOIN users u1 ON u1.Id = u.Id + 1
    WHERE u1.Id IS NULL
    ORDER BY u.Id
    LIMIT 0, 1
    

    게시물 오히려 오래된 있지만, 그것은 방문자의 일부를 도움이되기를 바랍니다.

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

    4.당신이 코멘트에 말을 감안할 때 :

    당신이 코멘트에 말을 감안할 때 :

    당신이 다음 삽입 된 행의 ID가 삽입 실제로 이전에 일 무슨 테이블을 요청하는 것입니다, 이는 요구하고 무엇을 할 수있는 방법이 있습니다 :

    SHOW TABLE STATUS WHERE name = "myTable"
    

    당신에게 다음 자동 증가 값을 알려줍니다 "AUTO_INCREMENT"이라고 그 결과 집합의 필드가있을 것입니다.

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

    5.내가 알고있는 것처럼, 경우 ID의이 : 1,2,4,5는 3을 반환해야합니다.

    내가 알고있는 것처럼, 경우 ID의이 : 1,2,4,5는 3을 반환해야합니다.

    SELECT t1.id + 1
    FROM theTable t1
    WHERE NOT EXISTS (
        SELECT * 
        FROM theTable t2
        WHERE t2.id = t1.id + 1
    )
    LIMIT 1
    
  6. ==============================

    6.당신은 말했다 :

    당신은 말했다 :

    당신을 위해 무엇을 요구하는지하는 것은 매우 위험하며 경쟁 조건으로 이어질 것입니다. 코드가 다른 사용자가 같은 시간에 두 번 실행하면, 그들은 모두 6을 얻을 것이다 그들의 업데이트 또는 삽입이 서로를 통해 모든 단계됩니다.

    난 당신이 대신 테이블에 INSERT LAST_INSERT_ID을 (사용 AUTO_INCREMENT 값)를 취득하고 당신이이 AUTO_INCREMENT 값에 따라이 어떤 값 세트에 행을 업데이트하는 것이 좋습니다.

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

    7.첫 번째 간격을 선택하려면이를 사용 :

    첫 번째 간격을 선택하려면이를 사용 :

    SELECT  @r
    FROM    (
            SELECT  @r := MIN(id) - 1
            FROM    t_source2
            ) vars,
            t_source2
    WHERE   (@r := @r + 1) <> id
    ORDER BY
            id
    LIMIT   1;
    

    동일한 쿼리의 ANSI 구문 버전이 있습니다 :

    SELECT  id
    FROM    mytable mo
    WHERE   (
            SELECT  id + 1
            FROM    mytable mi
            WHERE   mi.id < mo.id
            ORDER BY
                    mi.id DESC
            LIMIT 1
            ) <> id
    ORDER BY
            id,
    LIMIT   1
    

    그러나, 그것은 때문에 MySQL의에서 최적화 버그로 느려집니다.

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

    8.당신은 정말 (내 의견이 아니라 아주 좋은 생각이다) 행을 삽입하기 전에 다음 삽입의 키를 계산 싶은 경우에, 나는 당신이 현재 아이디와 하나 사용되는 최대 값을 사용하는 것이 좋습니다 것입니다 :

    당신은 정말 (내 의견이 아니라 아주 좋은 생각이다) 행을 삽입하기 전에 다음 삽입의 키를 계산 싶은 경우에, 나는 당신이 현재 아이디와 하나 사용되는 최대 값을 사용하는 것이 좋습니다 것입니다 :

    SELECT MAX(id) + 1 FROM table
    

    하지만 당신은 MySQL이와 ()는 DBMS에서 그걸 얻기 위해 LAST_INSERT_ID를 사용하여 (A 자동 증가 열을 사용하여) 아이디 자체를 만들 수 있도록 제안했다. 이렇게하려면 삽입과 같은 ID에 대한 다음 쿼리를 실행하는 트랜잭션을 사용 :

    INSERT INTO table (col1) VALUES ("Text");
    SELECT LAST_INSERT_ID();
    

    returnset 이제 새롭게 생성 된 행의 ID를 보유 하나의 열을 포함한다.

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

    9.지금은이 질문에 대답하기 너무 늦게, 그러나이 사람을 도움이되기를 바랍니다.

    지금은이 질문에 대답하기 너무 늦게, 그러나이 사람을 도움이되기를 바랍니다.

    @Eimantas 이미 최선의 답을 주신하지만 동일한 서버에서 같은 이름으로 두 개 이상의 테이블이있는 경우이 솔루션은 작동하지 않습니다.

    나는 약간 위의 문제를 해결하기 위해 Eimantas의 대답 @ 수정했습니다.

    select Auto_increment as id from information_schema.tables where table_name = 'table_name' and table_schema = 'database_name'
    
  10. ==============================

    10.그것을 할 수있는 한 가지 방법은 자동 증분으로 인덱스를 설정하는 것입니다. 그런 다음 SQL 문은 단순히 NULL을 지정하고 SQL 구문 분석기는 당신을 위해 나머지를한다.

    그것을 할 수있는 한 가지 방법은 자동 증분으로 인덱스를 설정하는 것입니다. 그런 다음 SQL 문은 단순히 NULL을 지정하고 SQL 구문 분석기는 당신을 위해 나머지를한다.

    INSERT INTO foo VALUES (null);
    
  11. ==============================

    11.이 새 레코드를 삽입 함께 사용되는 경우는 다음과 같이 사용할 수 있습니다.

    이 새 레코드를 삽입 함께 사용되는 경우는 다음과 같이 사용할 수 있습니다.

    (당신은 ID가 자동 증분입니다 귀하의 의견에 언급 한 다른 테이블에 다음 ID + 1이 필요합니다)

    INSERT INTO TABLE2 (id, field1, field2, field3, etc) 
    VALUES(
       SELECT (MAX(id) + 1), field1, field2, field3, etc FROM TABLE1
       WHERE condition_here_if_needed
    )
    

    이 의사이다 그러나 당신은 생각을

  12. ==============================

    12.많은 솔루션의 문제는 "1"경우 무시하고 그들은 단지 다음 "GAP"을 찾을 수 있습니다 볼 수 있습니다, 또는 행이없는 경우 그들은 다음 "GAP"로 NULL을 반환 할 수 있습니다.

    많은 솔루션의 문제는 "1"경우 무시하고 그들은 단지 다음 "GAP"을 찾을 수 있습니다 볼 수 있습니다, 또는 행이없는 경우 그들은 다음 "GAP"로 NULL을 반환 할 수 있습니다.

    사용 가능한 첫 번째 숫자가 1 인 경우에만 다음 사용 가능한 차이를 발견 할 수는 없을 것이다 다음은, 또한 고려 있습니다 :

    SELECT CASE WHEN MIN(MyID) IS NULL OR MIN(MyID)>1
    -- return 1 if it's available or if there are no rows yet
    THEN
        1
    ELSE -- find next gap
        (SELECT MIN(t.MyID)+1
        FROM MyTable t (updlock)
        WHERE NOT EXISTS (SELECT NULL FROM MyTable n WHERE n.MyID=t.MyID+1))
    END AS NextID
    FROM MyTable
    
  13. ==============================

    13.이것은 또한 "시작"위치의 문제를 해결, 나 (MySQL은 5.5) 잘했다.

    이것은 또한 "시작"위치의 문제를 해결, 나 (MySQL은 5.5) 잘했다.

    SELECT
        IF(res.nextID, res.nextID, @r) AS nextID
    FROM
        (SELECT @r := 30) AS vars,
        (
        SELECT MIN(t1.id + 1) AS nextID
        FROM test t1
        LEFT JOIN test t2
          ON t1.id + 1 = t2.id
        WHERE t1.id >= @r
          AND t2.id IS NULL
          AND EXISTS (
              SELECT id
              FROM test
              WHERE id = @r
          )
      LIMIT 1
      ) AS res
    LIMIT 1
    

    이러한 유형의 쿼리 전에 언급 한 바와 같이 최소한의 MySQL에 매우 느리다.

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

    14.

    SELECT ID+1 "NEXTID" 
    FROM ( 
        SELECT ID from TABLE1 
        WHERE ID>100 order by ID
    ) "X" 
    WHERE not exists (
        SELECT 1 FROM TABLE1 t2
        WHERE t2.ID=X.ID+1
    ) 
    LIMIT 1
    
  15. ==============================

    15.

    <?php
    Class Database{
        public $db;
        public $host   = DB_HOST;
        public $user   = DB_USER;
        public $pass   = DB_PASS;
        public $dbname = DB_NAME;
    
        public $link;
        public $error;
    
        public function __construct(){
            $this->connectDB();
        }
        private function connectDB(){
        $this->link = new mysqli($this->host, $this->user, $this->pass, $this->dbname);
        if(!$this->link){
            $this->error ="Connection fail".$this->link->connect_error;
            return false;
        }
     }
    
        // Select or Read data
    
        public function select($query){
            $result = $this->link->query($query) or die($this->link->error.__LINE__);
            if($result->num_rows > 0){
                return $result;
            } else {
                return false;
            }
        }
    
    }
     $db = new Database();
    $query = "SELECT * FROM table_name WHERE id > '$current_postid' ORDER BY ID ASC LIMIT 1";
    $postid = $db->select($query);
    if ($postid) {
      while ($result = $postid->fetch_assoc()) { 
            echo $result['id'];
        } 
    
      } ?>
    
  16. from https://stackoverflow.com/questions/1405393/finding-the-next-available-id-in-mysql by cc-by-sa and MIT license