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キャッシュされるこの公式のドキュメントの状態 。:MySQLはそれについていくつかの記事を持っているが、彼らは言及システムvaraibleが古いと思われるもブログ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も持っていれば次々と行くと思います。ただし、表示時に2つを連結するだけで、面倒な作業はすべて省きます。
SHOW TABLE STATUSdatabase 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'];
挿入時にIDを使用することはできません。また、IDは必要ありません。MySQLは、そのレコードを挿入するときにIDさえ知りません。テーブルに保存"sahf4d2fdd45"して、後でpayment_code使用することもできます。idpayment_code
本当にpayment_codeにIDを含める必要がある場合は、挿入後に行を更新してIDを追加します。
information_schema.tablesます。これは表にリストされています。
SELECT ... CONCAT(payment_code, id)です。をでラップSELECTしてVIEW、アプリからのすべてのSELECTのCONCATを気にすることなく、常に正しい値を返すようにすることもできます。
次の増分IDは何のために必要ですか?
MySQLはテーブルごとに1つの自動インクリメントフィールドのみを許可し、一意性を保証するための主キーでもある必要があります。
次の挿入IDを取得するとき、使用する値はそのトランザクションのスコープ内にあるため、使用できない場合があることに注意してください。したがって、データベースの負荷に応じて、その値は次のリクエストが届くまでにすでに使用されている可能性があります。
次に割り当てる自動インクリメント値を知る必要がないことを確認するために、設計をレビューすることをお勧めします
私はあなたが何をしているかを再考することを提案します。その特別な知識が必要な単一のユースケースを経験したことはありません。次のIDは非常に特別な実装の詳細であり、ACIDで安全であることを期待することはできません。
挿入された行を最後のIDで更新する単純なトランザクションを1つ作成します。
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列を使用する