itsource

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

mycopycode 2022. 11. 14. 21:39
반응형

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

MySQL 데이터베이스에서 사용 가능한 다음 ID(데이터베이스에 5개의 데이터가 있는 경우 사용 가능한 다음 삽입 위치 6개)를 찾아야 합니다.가가어 떻떻 ?럴? ???사용한 적이 있다MAX(id)그러나 데이터베이스에서 일부 행을 삭제해도 업데이트되지 않은 이전 최대값은 그대로 유지됩니다.

2014-12-05 업데이트

디에고의 코멘트뿐만 아니라 사이먼의 (수용된) 답변에 제시된 이유 때문에 나는 이 접근방식을 추천하지 않는다.고객님의 책임 하에 아래 쿼리를 사용해 주십시오.


원답

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';

다음 ID를 요청한 직후에 다른 사람이 새 행을 삽입할 수도 있기 때문에 다음 ID에 대해 확신할 수 없다고 생각합니다.적어도 트랜잭션은 필요합니다.제가 잘못 알고 있지 않다면 실제 ID는 삽입 후에만 취득할 수 있습니다.적어도 이것이 일반적인 처리 방법입니다.http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html를 참조하십시오.

LUFT-JOIN SQL.
아이디 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

비록 포스트가 다소 오래되었지만, 그것이 몇몇 방문객들에게 도움이 되기를 바랍니다.

당신이 댓글로 말한 것을 보면:

내 id coloumn은 auto increment입니다.아이디를 취득하여 다른 베이스로 변환해야 합니다.그래서 나는 다음 아이디를 얻어야 insert cause 변환 코드도 삽입될 것이다.

다음 삽입된 행의 ID를 테이블에 확인한 후 실제로 삽입하는 방법이 있습니다.

SHOW TABLE STATUS WHERE name = "myTable"

이 결과 세트에는 "Auto_increment"라는 필드가 있으며 다음 자동 증분 값을 알려줍니다.

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

다음과 같이 말했습니다.

내 id coloumn은 auto increment입니다.아이디를 취득하여 다른 베이스로 변환해야 합니다.그래서 나는 다음 아이디를 얻어야 insert cause 변환 코드도 삽입될 것이다.

당신이 요구하는 것은 매우 위험하고 인종 문제로 이어질 것입니다.다른 사용자에 의해 동시에 두 번 코드가 실행되면 둘 다 6이 되고 업데이트 또는 삽입이 서로 겹칩니다.

대신 당신에게 제안합니다.INSERT테이블로 이동하여 auto_module 값을 가져옵니다.LAST_INSERT_ID(),그리고 나서.UPDATEauto_module 값에 따라 값을 설정하는 행이 달라집니다.

첫 번째 간격을 선택하려면 다음을 사용합니다.

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

단, optimizer 버그로 인해 느려집니다.MySQL.

행을 삽입하기 전에 다음 삽입의 키를 계산하고 싶다면(제 생각에는 별로 좋지 않습니다), 현재 사용되는 최대 ID + 1을 사용하는 것이 좋습니다.

SELECT MAX(id) + 1 FROM table

하지만 MySQL이 (자동 증가 컬럼을 사용하여) ID 자체를 만들고LAST_INSERT_ID()DBMS에서 가져오려면 삽입을 실행하는 트랜잭션을 사용하여 다음과 같이 ID를 쿼리하십시오.

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

이제 반환 집합에는 새로 생성된 행의 ID가 들어 있는 열이 하나만 포함됩니다.

지금 이 질문에 답하기에는 너무 늦었지만, 이것이 누군가에게 도움이 되기를 바랍니다.

@Eimantas는 이미 최선의 답변을 제공했지만, 같은 서버 아래에 같은 이름의 테이블이 2개 이상 있으면 솔루션이 작동하지 않습니다.

위의 문제에 대처하기 위해 @Eimantas의 답변을 약간 수정했습니다.

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

인덱스를 자동 증분하도록 설정하는 것도 한 가지 방법입니다.그런 다음 SQL 문이 NULL을 지정하고 SQL 파서가 나머지 작업을 수행합니다.

INSERT INTO foo VALUES (null);

새로운 레코드를 삽입할 때 함께 사용하면 다음과 같은 것을 사용할 수 있습니다.

(댓글에 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
)

이것은 의사 코드이지만, 당신은 알 수 있다.

많은 솔루션에서 문제는 다음 "GAP"만 찾고 "1"을 사용할 수 있는지 또는 행이 없으면 다음 "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

이 방법은 저에게도 잘 작동했고(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에서는 이러한 유형의 쿼리가 매우 느립니다.

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
<?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'];
    } 

  } ?>

언급URL : https://stackoverflow.com/questions/1405393/finding-the-next-available-id-in-mysql

반응형