모든 테이블의 현재 AUTO_INCREMENT 값을 가져옵니다.


294

MySQL의 테이블에 대한 현재 AUTO_INCREMENT 값을 얻으려면 어떻게해야합니까?


31
이 질문은 반드시 중복되는 것은 아닙니다. 연결된 질문은 행 개수를 요청하고 허용되는 답변은 완전히 다른 질문 인 AUTO_INCREMENT가 아닌 행 개수 만 가져옵니다.
methai

답변:


569

이 쿼리를 사용하여 모든 테이블 데이터를 얻을 수 있습니다.

SHOW TABLE STATUS FROM `DatabaseName` WHERE `name` LIKE 'TableName' ;

이 쿼리를 사용하여이 정보를 정확하게 얻을 수 있습니다.

SELECT `AUTO_INCREMENT`
FROM  INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'DatabaseName'
AND   TABLE_NAME   = 'TableName';

34
DATABASE()명시 적 데이터베이스 이름 대신 사용할 수도 있습니다 .
M. Suleiman

22
참고 : USE DATABASE 명령을 실행 하지 않은 경우 DATABASE ()는 NULL입니다.
methai

5
당신이 할 수없는 이유가 SELECT MAX(id) FROM table_name있습니까?
Brian

43
마지막 레코드를 삭제하면 어떻게 되나요? 최대 당신에게 현재 AUTO_INCREMENT를 제공하지 않습니다
peterpeterson

3
이것은 테이블에서 최신 AUTO_INCREMENT 값을 제공합니까, 아니면 nnext 값은 무엇입니까?
sidx

18

MySQL의 LAST_INSERT_ID () 함수를 찾고 있다고 생각합니다 . 명령 행에 있으면 다음을 실행하십시오.

LAST_INSERT_ID();

SELECT 쿼리를 통해이 값을 얻을 수도 있습니다.

SELECT LAST_INSERT_ID();

3
하나를 추가하고 다음 행의 ID가 될 것으로 예상하는 것이 가장 좋은 아이디어는 아닙니다. 그 동안 다른 거래에서 새 행을 삽입 할 수 있으며 잘못된 ID를 올바르게 사용 하시겠습니까?
agim

네가 옳아. 나는 그것이 실행중인 환경에 달려 있다고 생각합니다. 통제 된 테스트 환경이라면 환경을 추가하고 안전 할 수 있습니다. 가장 좋은 답변은 methai가 제공 한 것입니다.
jvdub

2
가장 좋은 대답은 무엇을 이루고 싶은가에 달려 있습니다. 새 행을 삽입하고 생성 된 ID를 알고 싶다면 LAST_INSERT_ID ()가 트랜잭션에 안전하고 생성 된 객체의 ID를 얻으므로 응답이 가장 좋습니다. 나는 당신의 답변에 투표를했지만 'Add one to it ...'으로 부분을 삭제하겠습니다.
agim

25
LAST_INSERT_ID ()는 연결 당입니다. 즉, 다른 프로세스에서 세 개의 추가 행을 삽입하면 LAST_INSERT_ID () 호출이 다른 행과 달라집니다. 이 질문은 테이블 자체의 현재 AUTO_INC 값을 요청합니다.
methai

2
마지막 INSERT 문이 둘 이상의 행을 삽입 한 경우 잘못된 응답을 제공합니다. MySQL 문서 (강조 추가) : "LAST_INSERT_ID ()는 가장 최근에 실행 된 INSERT 문의 결과로 AUTO_INCREMENT 열에 성공적으로 삽입 된 첫 번째 자동 생성 값을 나타내는 64 비트 값을 반환합니다 ." 직관적! dev.mysql.com/doc/refman/5.6/en/…
Charlie

15

쿼리에서 번호를 얻는 것이 아니라 숫자를 알고 싶다면 다음을 사용할 수 있습니다.

SHOW CREATE TABLE tablename;

하단에 auto_increment가 표시되어야합니다


5
테이블에 행이없고 auto_increment가에 있으면 작동하지 않는 것 같습니다 1.
Pacerier

6

쿼리를 수동으로 실행하면 methai 의 답변이 맞 더라도 2 개의 동시 트랜잭션 / 연결이 실제로 프로덕션에서 런타임에이 쿼리를 실행할 때 문제가 발생합니다 (예 :) .

2 개의 연결이 동시에 열린 MySQL 워크 벤치에서 수동으로 시도했습니다.

CREATE TABLE translation (
  id BIGINT PRIMARY KEY AUTO_INCREMENT
);
# Suppose we have already 20 entries, we execute 2 new inserts:

거래 1 :

21 = SELECT `AUTO_INCREMENT` FROM INFORMATION_SCHEMA.TABLES
     WHERE TABLE_SCHEMA = 'DatabaseName' AND TABLE_NAME = 'translation';

insert into translation (id) values (21);

거래 2 :

21 = SELECT `AUTO_INCREMENT` FROM INFORMATION_SCHEMA.TABLES
     WHERE TABLE_SCHEMA = 'DatabaseName' AND TABLE_NAME = 'translation';

insert into translation (id) values (21);

# commit transaction 1;
# commit transaction 2;

트랜잭션 1의 삽입이 정상입니다. 트랜잭션 2의 삽입에 오류가 있습니다. 오류 코드 : 1062. 'PRIMARY'키에 대한 항목 '21'이 중복되었습니다.

트랜잭션 / 연결 당 2 개의 삽입물이 다음과 같기 때문에 jvdub 의 대답 이 좋은 해결책입니다 .

거래 1 :

insert into translation (id) values (null);
21 = SELECT LAST_INSERT_ID();

거래 2 :

insert into translation (id) values (null);
22 = SELECT LAST_INSERT_ID();

# commit transaction 1;
# commit transaction 2;

그러나 삽입 직후에 last_insert_id () 를 실행해야합니다 ! 외래 키가 필요한 다른 테이블에 삽입하기 위해 해당 ID를 재사용 할 수 있습니다!

또한 다음과 같이 2 개의 쿼리를 실행할 수 없습니다.

insert into translation (id) values ((SELECT AUTO_INCREMENT FROM
    information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE()
    AND TABLE_NAME='translation'));

실제로 다른 테이블에서 해당 ID를 가져 오거나 다시 사용하거나 반환하는 데 관심이 있기 때문입니다.


2
좋은 설명입니다! 감사. 이제 왜 우리가 사용하고 싶은지 분명합니다last_insert_id()
Imtiaz

이것은 흥미로운 시나리오이지만 실제로 AUTO_INCREMENT값 을 검색하는 질문에 대답하지는 않습니다 .
Sharlike

4

mysqli 실행 샘플 코드 :

<?php
    $db = new mysqli("localhost", "user", "password", "YourDatabaseName");
    if ($db->connect_errno) die ($db->connect_error);

    $table=$db->prepare("SHOW TABLE STATUS FROM YourDatabaseName");
    $table->execute();
    $sonuc = $table->get_result();
    while ($satir=$sonuc->fetch_assoc()){
        if ($satir["Name"]== "YourTableName"){
            $ai[$satir["Name"]]=$satir["Auto_increment"];
        }
    }
    $LastAutoIncrement=$ai["YourTableName"];
    echo $LastAutoIncrement;
?>  

1

SQL Server에서 열이 자동 증가하면 현재 자동 증가 된 값을 확인하고 해당 열의 해당 값을 편집하려면 다음 쿼리를 사용하십시오.

-- to get current value
select ident_current('Table_Name')

-- to update current value
dbcc checkident ('[Table_Name]',reseed,"Your Value")

1

주어진 스키마의 모든 테이블에 대해 AUTO_INCREMENT의 백분율 "사용률"을 확인하기위한 쿼리 ( bigint unsigned 유형의 열 제외 ) :

SELECT 
  c.TABLE_NAME,
  c.COLUMN_TYPE,
  c.MAX_VALUE,
  t.AUTO_INCREMENT,
  IF (c.MAX_VALUE > 0, ROUND(100 * t.AUTO_INCREMENT / c.MAX_VALUE, 2), -1) AS "Usage (%)" 
FROM 
  (SELECT 
     TABLE_SCHEMA,
     TABLE_NAME,
     COLUMN_TYPE,
     CASE 
        WHEN COLUMN_TYPE LIKE 'tinyint(1)' THEN 127
        WHEN COLUMN_TYPE LIKE 'tinyint(1) unsigned' THEN 255
        WHEN COLUMN_TYPE LIKE 'smallint(%)' THEN 32767
        WHEN COLUMN_TYPE LIKE 'smallint(%) unsigned' THEN 65535
        WHEN COLUMN_TYPE LIKE 'mediumint(%)' THEN 8388607
        WHEN COLUMN_TYPE LIKE 'mediumint(%) unsigned' THEN 16777215
        WHEN COLUMN_TYPE LIKE 'int(%)' THEN 2147483647
        WHEN COLUMN_TYPE LIKE 'int(%) unsigned' THEN 4294967295
        WHEN COLUMN_TYPE LIKE 'bigint(%)' THEN 9223372036854775807
        WHEN COLUMN_TYPE LIKE 'bigint(%) unsigned' THEN 0
        ELSE 0
     END AS "MAX_VALUE" 
   FROM 
     INFORMATION_SCHEMA.COLUMNS
     WHERE EXTRA LIKE '%auto_increment%'
   ) c

   JOIN INFORMATION_SCHEMA.TABLES t ON (t.TABLE_SCHEMA = c.TABLE_SCHEMA AND t.TABLE_NAME = c.TABLE_NAME)

WHERE
 c.TABLE_SCHEMA = 'YOUR_SCHEMA' 
ORDER BY
 `Usage (%)` DESC;

0

나는 똑같은 것을 찾고 헬퍼 클래스 내부에 정적 메소드를 만들어서 끝났다 (내 경우에는 App \ Helpers \ Database라고 명명했다).

방법

/**
 * Method to get the autoincrement value from a database table
 *
 * @access public
 *
 * @param string $database The database name or configuration in the .env file
 * @param string $table    The table name
 *
 * @return mixed
 */
public static function getAutoIncrementValue($database, $table)
{
    $database ?? env('DB_DATABASE');

    return \DB::select("
        SELECT AUTO_INCREMENT 
        FROM information_schema.TABLES 
        WHERE TABLE_SCHEMA = '" . env('DB_DATABASE') . "' 
        AND TABLE_NAME = '" . $table . "'"
    )[0]->AUTO_INCREMENT;
}

메소드를 호출하고 MySql AUTO_INCREMENT를 얻으려면 다음을 사용하십시오.

$auto_increment = \App\Helpers\Database::getAutoIncrementValue(env('DB_DATABASE'), 'your_table_name');

도움이 되길 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.