MySQL 現在:
http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id
生成された ID は、接続ごとにサーバーに保持されます。これは、関数によって特定のクライアントに返される値が、そのクライアントによって AUTO_INCREMENT 列に影響を与える最新のステートメントに対して生成された最初の AUTO_INCREMENT 値であることを意味します。この値は、他のクライアントが独自の AUTO_INCREMENT 値を生成したとしても、影響を受けることはありません。この動作により、各クライアントは、他のクライアントのアクティビティを気にせず、ロックやトランザクションを必要とせずに、独自の ID を取得できるようになります。
いくつかのテストを実装しましょう:
<?php
header('Content-Type: text/plain');
$con1 = new mysqli('localhost', 'root', '1', 'new_schema');
$con2 = new mysqli('localhost', 'root', '1', 'new_schema');
$sql = 'DROP TABLE IF EXISTS `x`';
$con1->query($sql);
$sql = <<<SQL
CREATE TABLE `x`(
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`value` VARCHAR(20)
)ENGINE=InnoDB;
SQL;
$con1->query($sql);
$sql = <<<SQL
INSERT INTO `x` (`id`, `value`)
VALUES (NULL, NULL);
SQL;
$con1->query($sql);
$con2->query($sql);
echo 'con1 == con2 is ', $con1 == $con2 ? 'true' : 'false', PHP_EOL;
echo 'con1 === con2 is ', $con1 === $con2 ? 'true' : 'false', PHP_EOL;
echo '1: ', $con1->insert_id, PHP_EOL;
echo '2: ', $con2->insert_id, PHP_EOL;
$con1->close();
$con2->close();
?>
ショー:
con1 == con2 is true
con1 === con2 is false
1: 1
2: 2
被験者:
PHP 5.4.5
, MySQL 5.6.10
.