MySQL + Doctrine2 DBAL でシーケンス発行

まずはシーケンスを保持するMyISAMテーブルを用意します。

CREATE TABLE seq_example (
  id bigint(20) unsigned not null
) ENGINE=MyISAM;

mysql> insert into seq_example values (1);

mysql> select * from seq_example;
+----+
| id |
+----+
|  1 |
+----+
1 row in set (0.00 sec)

mysql> update seq_example set id = last_insert_id(id + 1);

mysql> select * from seq_example;
+----+
| id |
+----+
|  2 |
+----+
1 row in set (0.00 sec)

MySQLのlast_insert_id()は

生成された ID は、接続ベースで サーバ内で保持されます。
この値は、他のクライアントが独自の AUTO_INCREMENT 値を生成した場合でも、他のクライアントによって影響を受けることはありません。
この動作は、各クライアントが他のクライアントの動向を気にせず、ロックやトランザクションなしで、独自の ID を呼び出せるようにします。

とのことなので、

class GetSequenceCommand extends ContainerAwareCommand
{

    protected function configure()
    {
        $this->setName('app:example:get-sequence');
        $this->setDescription('シーケンスの発行');
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $conn = $this->getContainer()->get('database_connection');
        $conn->executeUpdate('update seq_example set id = last_insert_id(id + 1)');
        $seq = $conn->lastInsertId();

        echo $seq;
    }
}

上記の様なSymfony2コマンドを作って実験。

$ php app/console app:example:get-sequence
3
$ php app/console app:example:get-sequence
4
$ php app/console app:example:get-sequence
5

んー。