mysql에서 다음 ID를 가져와 테이블에 삽입하는 방법
INSERT INTO payments (date, item, method, payment_code)
VALUES (NOW(), '1 Month', 'paypal', CONCAT("sahf4d2fdd45", id))
mysql에서 다음 ID를 가져와 테이블에 삽입하는 방법
INSERT INTO payments (date, item, method, payment_code)
VALUES (NOW(), '1 Month', 'paypal', CONCAT("sahf4d2fdd45", id))
답변:
LAST_INSERT_ID()
mysqli_insert_id
당신이 사용할 수있는
SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name = 'table_name'
AND table_schema = DATABASE( ) ;
또는 information_schema를 사용하지 않으려면 이것을 사용할 수 있습니다.
SHOW TABLE STATUS LIKE 'table_name'
TABLES.AUTO_INCREMENT
캐시 된 이 공식 문서 상태 는 dev.mysql.com/doc/refman/8.0/en/… 입니다. Mysql 블로그에도 여러 게시물이 있지만 그들이 언급 한 시스템 변수는 구식 인 것 같습니다 : mysqlserverteam.com/… mysqlserverteam.com/…
다음 을 수행 하여 다음 자동 증가 값을 얻을 수 있습니다 .
SHOW TABLE STATUS FROM tablename LIKE Auto_increment
/*or*/
SELECT `auto_increment` FROM INFORMATION_SCHEMA.TABLES
WHERE table_name = 'tablename'
이를 사용하여 테이블을 변경 해서는 안되며 , 대신 auto_increment 열을 사용하여 자동으로 수행하십시오.
문제는 last_insert_id()
회고 적이므로 현재 연결 내에서 보장 될 수 있다는 것 입니다.
이 아기는 장래성이므로 연결마다 고유하지 않으며 신뢰할 수 없습니다.
단일 연결 데이터베이스에서만 작동하지만 오늘날 단일 연결 데이터베이스는 내일 여러 연결 데이터베이스가되는 습관이 있습니다.
insert into table_name (field1, field2) select 'constant', auto_increment from information_schema.tables where table_name = 'table_name'
? 나는 after insert
트리거 에서 업데이트를 사용 하고 last_insert_id()
, 그래도 ...
UPDATE
있다면 후속으로 갈 것입니다 . 하지만 표시 시간에 두 개를 연결하고 모든 번거 로움을 덜어주고 싶습니다.
SHOW TABLE STATUS
database name
이후 FROM
와 'table name pattern'
이후 를 볼 것으로 예상됩니다 LIKE
.
이것은 MySQL 데이터베이스에 대한 자동 증분 값을 반환하며 다른 데이터베이스와 확인하지 않았습니다. 다른 데이터베이스를 사용하는 경우 쿼리 구문이 다를 수 있습니다.
SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name = 'your_table_name'
and table_schema = 'your_database_name';
SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name = 'your_table_name'
and table_schema = database();
최고의 답변은 솔루션으로 PHP MySQL_ 을 사용하며 , 이를 달성하기 위해 업데이트 된 PHP MySQLi_ 솔루션을 공유 할 것이라고 생각 했습니다. 이 예제에는 오류 출력이 없습니다!
$db = new mysqli('localhost', 'user', 'pass', 'database');
$sql = "SHOW TABLE STATUS LIKE 'table'";
$result=$db->query($sql);
$row = $result->fetch_assoc();
echo $row['Auto_increment'];
테이블에서 다음 자동 증분을 시작합니다.
PHP에서는 다음을 시도 할 수 있습니다.
$query = mysql_query("SELECT MAX(id) FROM `your_table_name`");
$results = mysql_fetch_array($query);
$cur_auto_id = $results['MAX(id)'] + 1;
또는
$result = mysql_query("SHOW TABLE STATUS WHERE `Name` = 'your_table_name'");
$data = mysql_fetch_assoc($result);
$next_increment = $data['Auto_increment'];
해결책:
CREATE TRIGGER `IdTrigger` BEFORE INSERT ON `payments`
FOR EACH ROW
BEGIN
SELECT AUTO_INCREMENT Into @xId
FROM information_schema.tables
WHERE
Table_SCHEMA ="DataBaseName" AND
table_name = "payments";
SET NEW.`payment_code` = CONCAT("sahf4d2fdd45",@xId);
END;
"DataBaseName"은 데이터베이스의 이름입니다.
삽입하는 동안 ID를 사용할 수 없으며 필요하지도 않습니다. MySQL은 해당 레코드를 삽입 할 때 ID도 알지 못합니다. 당신은 절약 할 수 "sahf4d2fdd45"
에서 payment_code
테이블을 사용 id
하고 payment_code
나중에.
지불 코드에 ID가 있어야 실제로 필요한 경우 삽입 후 행을 업데이트하여 ID를 추가하십시오.
information_schema.tables
표에 나열되어 있습니다.
SELECT ... CONCAT(payment_code, id)
또는 애플리케이션 코드에서). 당신도 포장 할 수 SELECT
A의 VIEW
당신은 항상 당신의 응용 프로그램에서 모든 SELECT에서 CONCAT에 대한 걱정없이, 올바른 값을 반환 그래서.
다음 증분 ID가 필요한 것은 무엇입니까?
MySQL은 테이블 당 하나의 자동 증가 필드 만 허용하며 고유성을 보장하려면 기본 키 여야합니다.
다음 삽입 ID를 받으면 보유한 값이 해당 트랜잭션의 범위 내에 있기 때문에 사용할 때 사용하지 못할 수 있습니다. 따라서 데이터베이스의로드에 따라 다음 요청이 들어올 때 해당 값이 이미 사용되었을 수 있습니다.
다음에 할당 할 자동 증가 값을 알 필요가 없는지 확인하기 위해 디자인을 검토하는 것이 좋습니다.
나는 당신이하는 일을 다시 생각할 것을 제안합니다. 나는 특별한 지식이 필요한 단일 사용 사례를 경험 한 적이 없습니다. 다음 ID는 매우 특별한 구현 세부 사항이며 ACID 안전을 고려하지 않습니다.
마지막 ID로 삽입 된 행을 업데이트하는 간단한 트랜잭션을 만듭니다.
BEGIN;
INSERT INTO payments (date, item, method)
VALUES (NOW(), '1 Month', 'paypal');
UPDATE payments SET payment_code = CONCAT("sahf4d2fdd45", LAST_INSERT_ID())
WHERE id = LAST_INSERT_ID();
COMMIT;
"mysql_insert_id ()"를 사용하십시오. mysql_insert_id ()는 마지막으로 수행 된 쿼리에 대해 작동하므로 값을 생성하는 쿼리 직후에 mysql_insert_id ()를 호출해야합니다.
다음은 사용 예입니다.
<?php
$link = mysql_connect('localhost', 'username', 'password');
if (!$link) {
die('Could not connect: ' . mysql_error());
}
mysql_select_db('mydb');
mysql_query("INSERT INTO mytable VALUES('','value')");
printf("Last inserted record has id %d\n", mysql_insert_id());
?>
위의 예가 유용하기를 바랍니다.
mysql_insert_id();
그게 다야 :)
SELECT id FROM `table` ORDER BY id DESC LIMIT 1
생산성은 의심 스럽지만 100 % 신뢰할 수 있습니다
ravi404의 답변 사용 :
CREATE FUNCTION `getAutoincrementalNextVal`(`TableName` VARCHAR(50))
RETURNS BIGINT
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
DECLARE Value BIGINT;
SELECT
AUTO_INCREMENT INTO Value
FROM
information_schema.tables
WHERE
table_name = TableName AND
table_schema = DATABASE();
RETURN Value;
END
삽입 쿼리에서 사용하여 SHA1 해시를 만듭니다. 전의.:
INSERT INTO
document (Code, Title, Body)
VALUES (
sha1( getAutoincrementalNextval ('document') ),
'Title',
'Body'
);
자동 증가 오프셋이 1이 아닌 경우 @ ravi404 개선 :
SELECT (`auto_increment`-1) + IFNULL(@@auto_increment_offset,1)
FROM INFORMATION_SCHEMA.TABLES
WHERE table_name = your_table_name
AND table_schema = DATABASE( );
( auto_increment
-1) : db 엔진은 오프셋 1을 고려하는 것 같습니다. 따라서이 가정을 버리고 옵션 값인 @@ auto_increment_offset을 추가하거나 기본값을 1로 설정해야합니다. IFNULL (@@ auto_increment_offset, 1)
나를 위해 그것은 작동하고 간단 해 보입니다.
$auto_inc_db = mysql_query("SELECT * FROM my_table_name ORDER BY id ASC ");
while($auto_inc_result = mysql_fetch_array($auto_inc_db))
{
$last_id = $auto_inc_result['id'];
}
$next_id = ($last_id+1);
echo $next_id;//this is the new id, if auto increment is on
$last_id
당신이 할 수있을 때 반복적 으로 할당 하는 것은 매우 불필요합니다 DESC
. 귀하의 while
블록은 쓸모없는 작업을 많이했습니다.
auto_increment
열 사용