PHP에서 MySQL 테이블의 마지막으로 삽입 된 ID를 얻으려면 어떻게해야합니까?


93

새 데이터가 자주 삽입되는 테이블이 있습니다. 테이블의 마지막 ID를 가져와야합니다. 어떻게 할 수 있습니까?

유사 SELECT MAX(id) FROM table합니까?


1
예,이 쿼리는 테이블의 마지막 ID를 반환합니다. 그러나 한 가지 조건은 ID가 기본 키 여야한다는 것입니다. 따라서 회개를 피할 수 있습니다.
sathish 2009

7
@sathish :이 방법의 주요 문제는 동시성 입니다.
CMS

3
정교하게하려면 그것으로 문제는 그 경우의 테이블에 다른 사람 삽입 뭔가 INSERT및 쿼리 MAX(id), 당신이 아니라 id를 얻을 수 있습니다 당신의 마지막 ID를.
deceze

3
@Jocelyn이 질문은 1 년 후이 질문보다 조회수가 수천 회 적었습니다.
Naftali aka Neal

3
@ 닐, 당신 말이 맞아요. 다른 질문은이 질문의 중복으로 종료되어야합니다.
Jocelyn

답변:


133

PDO를 사용하는 경우 PDO::lastInsertId.

Mysqli를 사용하는 경우 mysqli::$insert_id.

여전히 Mysql을 사용하는 경우 :

mysql_*새 코드에서 함수를 사용하지 마십시오 . 더 이상 유지 되지 않으며 공식적으로 사용되지 않습니다 . 참고 항목 빨간색 상자 ? 에 대해 알아 준비된 문 대신 사용할 PDO 또는 MySQLi를 - 이 기사는 당신이 어떤을 결정하는 데 도움이됩니다. PDO를 선택한 경우 여기에 좋은 자습서가 있습니다.

그러나 필요한 경우 mysql_insert_id.


이 문제는 삽입이 많이 발생하는 경우 (예 : 데이터베이스도 무언가를 기록) 잘못된 ID를 얻을 수 있다는 것입니다.
Mike

당신이 사용하는 경우하지 @ 마이크 mysql_insert_id 후 바로 당신 mysql_query. 물론 그 사이에 동일한 연결에 대해 다른 쿼리를 여러 개 실행하는 경우 도움이 될 수있는 것은 없습니다.
deceze

7
잘못된 ID를 얻지 않도록 보장하려면 코드를 TRANSACTION으로 래핑하십시오 .
Marcelo Assis

28
mysql은 이것이 CURRENT CONNECTION의 마지막 ID인지 확인하므로 삽입 쿼리 바로 뒤에이 명령문을 넣으면 문제가 없습니다. 삽입을 수행하는 다른 프로세스에 대해 걱정할 필요가 없으며이를 트랜잭션에 래핑 할 필요가 없습니다. mysql 매뉴얼에 따르면 "생성 된 ID는 연결별로 서버에서 유지됩니다. 이는 함수가 특정 클라이언트에 반환 한 값이 AUTO_INCREMENT 열에 영향을 미치는 가장 최근 문에 대해 생성 된 첫 번째 AUTO_INCREMENT 값임을 의미합니다. 에 의해 해당 클라이언트 이것은 당신이해야하는 이유이다. 하지 MAX (ID)를 선택 사용이
woens

1
@deceze, PDO우리가 어디서나 볼 수있는 편견은 무엇입니까 ? 기능 비교를 다시 살펴 보겠습니다 . mysqli낮은 수준의 물건으로 손을 더럽힐 필요가있을 때 그것이 승자임이 분명합니다 . 즉, PDO를 선택하더라도 어쨌든 결국 사용해야 mysqli합니다.
Pacerier

53

현재 연결에 삽입 된 마지막 ID가 무엇인지 아는 기능이 있습니다.

mysql_query('INSERT INTO FOO(a) VALUES(\'b\')');
$id = mysql_insert_id();

플러스 사용하여 최대 것은 A는 나쁜 아이디어 가 발생할 수 있기 때문에 문제 두 개의 다른 세션에서 코드를 동시에 사용하면 입니다.

이 함수를 mysql_insert_id 라고합니다.


2
mysql _ (...)은 PHP> = 5.5 버전에서 더 이상 사용되지 않습니다.
이아고

네, 그냥 기억하고 있습니다. :)
Iago 2014


18

PDO :

$pdo->lastInsertId();

Mysqli :

$mysqli->insert_id;

mysql_*새 코드에서 함수를 사용하지 마십시오 . 더 이상 유지 되지 않으며 공식적으로 사용되지 않습니다 . 참고 항목 빨간색 상자 ? 에 대해 알아 준비된 문 대신 사용할 PDO 또는 MySQLi를 - 이 기사는 당신이 어떤을 결정하는 데 도움이됩니다. PDO를 선택한 경우 여기에 좋은 자습서가 있습니다.



8

당신이 쓴 내용은 id그들이 독특하고 자동으로 증가한다고 가정 하면 가장 큰 결과를 얻을 수 있으며 동시성 문제를 초대해도 괜찮을 것입니다.
MySQL을 데이터베이스로 사용하고 있기 때문에 LAST_INSERT_ID()삽입을 수행 한 현재 연결에서만 작동 하는 특정 기능 이 있습니다.
PHP는 mysql_insert_id.


6

이것이 잘 작동합니다.

$link = mysqli_connect("localhost", "my_user", "my_password", "world");

$query = "INSERT blah blah blah...";
$result = mysqli_query($link, $query);

echo mysqli_insert_id($link);

1
알아 주셔서 감사합니다. 나는 (변수는 연결 유지) 실제로 $ 링크가 코드를 편집 한
산두

3

내장 된 PHP 기능으로 최근 삽입 된 ID를 얻을 수 있습니다. mysql_insert_id();

$id = mysql_insert_id();

당신은 또한 최신 ID를 얻을

$id = last_insert_id();

4
또한 더 이상 사용되지 않는 라이브러리를 사용하도록 제안하기 때문에 잘못된 것입니다. 정말,이 삭제
STT LCU

@STTLCU 여기에서 사용되지 않는 코드는 무엇입니까?
TheBlackBenzKid

그들은 mysql_로 * 기능을 기반으로하고 있기 때문에, 모두 @TheBlackBenzKid
STT LCU에게

@Rahul $ id = last_insert_id (); 더 이상 사용되지 않을 수 있으므로 작동하지 않습니다.
Esha 2014.10.20

3

codeigniter에서 마지막으로 삽입 된 ID를 얻으려면 삽입 쿼리를 실행 한 후 insert_id() 데이터베이스에서 된 하면 마지막으로 삽입 된 ID를 반환합니다.

전의:

$this->db->insert('mytable',$data);
echo $this->db->insert_id(); //returns last inserted id

한 줄로

echo $this->db->insert('mytable',$data)->insert_id();

3

을 사용하는 것은 괜찮지 만 사용 mysql_insert_id()에 대한 특정 참고 사항이 하나 있습니다. INSERT 쿼리를 실행 한 후 호출해야합니다. 즉, 동일한 스크립트 세션에서 의미합니다. 그렇지 않으면 올바르게 작동하지 않습니다.


2

깨끗하고 간단합니다-

$selectquery="SELECT id FROM tableName ORDER BY id DESC LIMIT 1";
$result = $mysqli->query($selectquery);
$row = $result->fetch_assoc();
echo $row['id'];

1

참고 : 하나의 문으로 여러 삽입을 수행하면 mysqli :: insert_id가 올바르지 않습니다.

탁자:

create table xyz (id int(11) auto_increment, name varchar(255), primary key(id));

이제 다음을 수행하십시오.

insert into xyz (name) values('one'),('two'),('three');

mysqli :: insert_id는 3이 아닌 1이됩니다.

올바른 값을 얻으려면 다음을 수행하십시오.

mysqli::insert_id + mysqli::affected_rows) - 1

이것은 문서이지만 약간 모호합니다.


1

원하는 테이블의 마지막 auto_increment ID를 얻기 위해 순수한 MySQL 구문을 사용하는 것을 선호합니다.

php mysql_insert_id () 및 mysql last_insert_id ()는 마지막 트랜잭션 ID 만 제공합니다.

스키마에있는 테이블의 마지막 auto_incremented ID (마지막 트랜잭션 1뿐만 아니라)를 원하는 경우이 쿼리를 사용할 수 있습니다.

SELECT AUTO_INCREMENT FROM information_schema.TABLES
    WHERE TABLE_SCHEMA = 'my_database' 
    AND TABLE_NAME = 'my_table_name';

그게 다야.


이 SQL은 질문의 맥락에서 단순히 잘못 되었기 때문에 이것에 대해 의심 스럽습니다 .... 또한이 방법은 두 개 이상의 클라이언트가 거의 동시에이 SQL을 실행할 때 가능한 경쟁 조건이 발생하기 쉽습니다. 삽입 후이 열 데이터가 얼마나 빨리 업데이트되는지 의심 스럽습니다. ... 마지막으로 ID를 얻을 수있는 PHP 함수는 연결 / 세션 레벨을 기반으로 (더 많거나 적은 MySQL의의와 동일하지 LAST_INSERT_ID () 경쟁 조건 저장을합니다)
레이몬드 Nijland

1

예를 들어 답을 보지 못하는 것이 슬프다.

사용 Mysqli을 :: $ INSERT_ID를 :

$sql="INSERT INTO table (col1, col2, col3) VALUES (val1, val2, val3)";
$mysqli->query($sql);
$last_inserted_id=$mysqli->insert_id; // returns last ID

사용 PDO를 :: lastInsertId를 :

$sql="INSERT INTO table (col1, col2, col3) VALUES (val1, val2, val3)";
$database->query($sql);
$last_inserted_id=$database->lastInsertId(); // returns last ID

0

MySQLi트랜잭션을 사용하면 mysqli::$insert_id0을 반환했기 때문에 때때로를 가져올 수 없었습니다. 특히 저장 프로 시저를 사용하는 경우 INSERTs 를 실행 합니다. 따라서 거래에는 다른 방법이 있습니다.

<?php

function getInsertId(mysqli &$instance, $enforceQuery = false){
    if(!$enforceQuery)return $instance->insert_id;

    $result = $instance->query('SELECT LAST_INSERT_ID();');

    if($instance->errno)return false;

    list($buffer) = $result->fetch_row();

    $result->free();

    unset($result);

    return $buffer;
}

?>

0

사용 mysqliMySQL은 depricating입니다

<?php
$mysqli = new mysqli("localhost", "yourUsername", "yourPassword", "yourDB");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}
// Conside employee table with id,name,designation
$query = "INSERT INTO myCity VALUES (NULL, 'Ram', 'Developer')";
$mysqli->query($query);

printf ("New Record has id %d.\n", $mysqli->insert_id);

/* close connection */
$mysqli->close();
?>

0

나는 시도했다

mysqli_insert_id ($ dbConnectionObj)

이것은 현재 연결의 마지막으로 삽입 된 ID를 반환하므로 연결을 제대로 관리하고 있다면 이것이 작동합니다. 적어도 나를 위해 일했습니다.


0

PDP를 사용하고 이것을 시도하십시오

$stmt = $db->prepare("...");
$stmt->execute();
$id = $db->lastInsertId();


-1

이 모든 논의에서 나는 max id를 확인하는 이유가 다음이 무엇인지 아는 것이라고 가정합니다. (내 최대 id가 5이면 다음은 5 + 1 = 6이됩니다).

>>이게 이유가 아니라면 사과드립니다.

다른 사람이 귀하의 CHECK와 INSERT 사이에 정보를 INSERT하면 잘못된 ID를 제공하는 경우.

따라서 타임 스탬프 또는 기타 고유 한 값을 포함 할 수있는 해시를 만들면 해결할 수 있습니다.

그런 다음 동일한 함수에서 빈 값과 해시로 정보를 삽입 할 수 있습니다. AUTO_INCRECEMENT를 선택한 경우 ID가 생성됩니다.

그런 다음 동일한 기능에서 여전히 해시를 보유하고 동일한 해시로 ID를 찾을 수 있습니다. 그런 다음 mysql UPDATE로 빈 값 채우기를 완료 할 수 있습니다.

여기에는 더 많은 연결이 포함되지만 여전히이를 수행하는 방법입니다 ...

행운을 빕니다.


-2

테이블에 UserID, Emp_ID, ..과 같은 AUTO INCREMENT 열이있는 경우이 쿼리를 사용하여 마지막으로 삽입 된 레코드를 가져올 수 있습니다. SELECT * FROM table_name where UserID = (select MAX (UserID) from table_name) PHP 코드에서 :

$con = mysqli_connect('localhost', 'userid', 'password', 'database_name');
                                if (!$con) {
                                    die('Could not connect: ' . mysqli_error($con));
                                }
                                $sql = "SELECT * FROM table_name where UserID=(select MAX(UserID)from table_name)";
                                $result = mysqli_query($con, $sql);

그런 다음 가져온 데이터를 요구 사항으로 사용할 수 있습니다.


암호를 암호화하지 마십시오 . 공격자가 DB를 가져 오면 암호화 키도 얻게됩니다.
zaph

-3
mysql_query("INSERT INTO mytable (product) values ('kossu')");

printf("Last inserted record has id %d\n", ***mysql_insert_id()***);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.