初めてのRuby
この本を買いました。
どうも評判が良いようで、おもわず買ってしまいました。
まだ、読んでないのですが。。。

著者のYuguiさんのブログを読んでいたら、以下のようなエントリーがあり、結構びっくりして、調べた結果をエントリーします。
知っている人にとっては当たり前なのかもしれませんが。。

Active Recordが不適当なキャッシュを返す(?)問題 @ 2006年05月 @ ratio - rational - irrational @ IDM
ActiveRecordが誤ってキャッシュか何かを返している感じ。これで数時間嵌まった。
新規レコードをsave後、find_by_id(nil)すると、初回の呼び出しに限りsaveしたオブジェクトがマッチする。
MySQLが不適当なレコードを返す問題。 @ 2006年06月 @ ratio - rational - irrational @ IDM
Active Recordから変なレコードが返ってくるのは、Active Recordの問題かと思ったらMySQLの問題だった。Active Recordよ、疑って済まなかった。
とういう事で、自分でもmysqlで上記のようなSQLを実行してみた。
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 878 to server version: 5.0.27

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> INSERT INTO tags( name ) VALUES( 'test' );
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM tags WHERE id IS NULL LIMIT 1;
+----+------+------------+------------+------------+
| id | name | tagkind_id | created_at | updated_at |
+----+------+------------+------------+------------+
| 21 | test |       NULL | NULL       | NULL       |
+----+------+------------+------------+------------+
1 row in set (0.00 sec)

やはり、同じ結果になります。
で、MySQLのマニュアルを調べてみると、 この動作は仕様みたい。
MySQL :: MySQL 5.1 リファレンスマニュアル :: 11.1.3 比較関数と演算子
ODBC プログラムとうまく適合させるため、IS NULL を使用する場合、MySQL は次の追加機能をサポートします :
  • 一番最近の AUTO_INCREMENT 値を含む行を、その値を生成した直後に、次のフォームのステートメントを発行することによって検索することができます :
          SELECT * FROM tbl_name WHERE auto_col IS NULL
    
  • この動作は、SQL_AUTO_IS_NULL=0 を設定すると無効になります。項12.5.3. 「SET 構文」 を参照してください。
なるほどね。
set SQT_ATUO_IS_NULL=0 を発行すれば、OKなようなので、もう一度試してみました。
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 879 to server version: 5.0.27

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> set SQL_AUTO_IS_NULL=0;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO tags( name ) VALUES( 'test' );
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM tags WHERE id IS NULL LIMIT 1;
Empty set (0.00 sec)

おお。
でもこれって、デフォルトで0で良いんじゃないか??
と思いつつ、じゃあ、ActiveRecordはって事で調べてみると、
File: CHANGELOG
# MySQL: SET SQL_AUTO_IS_NULL=0 so ‘where id is null’ doesn‘t select the last inserted id. 6778 [Jonathan Viney, timc]
って事で、とっくに対応されてるって事ですね。
安心安心。