MySQLのこういうのっていかがなもんか

良くはない。それはわかってる。でもなんかちょっとくらいなら使っていいかな的な
例えばこのようなテーブル

Create Table: CREATE TABLE `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(128) NOT NULL,
  `delete_null_flag` tinyint(1) DEFAULT '1',
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`,`delete_null_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

があって、適当にinsertしてみる

mysql> insert into users (name) values ('shoichimasuhara');
Query OK, 1 row affected (0.01 sec)

まあ普通に入るし

mysql> select * from users;
+----+-----------------+------------------+
| id | name            | delete_null_flag |
+----+-----------------+------------------+
|  1 | shoichimasuhara |                1 |
+----+-----------------+------------------+

もう一回同じのを入れるとunique制約でコケる

mysql> insert into users (name) values ('shoichimasuhara');
ERROR 1062 (23000): Duplicate entry 'shoichimasuhara-1' for key 'name'

ところでdelete_null_flagをNULLにしてみてもう一度insert

mysql> update users set delete_null_flag = NULL where id = 1;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from users;
+----+-----------------+------------------+
| id | name            | delete_null_flag |
+----+-----------------+------------------+
|  1 | shoichimasuhara |             NULL |
+----+-----------------+------------------+
1 row in set (0.00 sec)

mysql> insert into users (name) values ('shoichimasuhara');
Query OK, 1 row affected (0.01 sec)

mysql> select * from users;
+----+-----------------+------------------+
| id | name            | delete_null_flag |
+----+-----------------+------------------+
|  1 | shoichimasuhara |             NULL |
|  3 | shoichimasuhara |                1 |
+----+-----------------+------------------+
2 rows in set (0.00 sec)

そりゃま成功するんだけど、さらに追加したレコードのdelete_null_flagもNULLにしてみると

mysql> update users set delete_null_flag = NULL where id = 3;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from users;
+----+-----------------+------------------+
| id | name            | delete_null_flag |
+----+-----------------+------------------+
|  1 | shoichimasuhara |             NULL |
|  3 | shoichimasuhara |             NULL |
+----+-----------------+------------------+
2 rows in set (0.00 sec)

成功。知らなかった(無知ですみませんすみません…)。これは

NULLは各々ユニークとして扱われる

ということらしい(ほんとか?) まあだいたいそんな感じ。調べてない。気になる人調べて。

んで

アクティブなユーザ名はユニークにしたいけど削除されたユーザの情報は残したい。でも削除済みユーザテーブルは作りたくない

とかいうワガママを発揮したい時にdeleteフラグに使えないかなーなんてだめですかそうですか。なんか他にまともな方法無いですか…。

mysql> alter table users add comment text;
Query OK, 2 rows affected (0.06 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> insert into users (name, comment) values ('shoichimasuhara', '私はたぶん3人目だと思うから。');
Query OK, 1 row affected (0.01 sec)

mysql> select * from users\G
*************************** 1. row ***************************
              id: 1
            name: shoichimasuhara
delete_null_flag: NULL
         comment: NULL
*************************** 2. row ***************************
              id: 3
            name: shoichimasuhara
delete_null_flag: NULL
         comment: NULL
*************************** 3. row ***************************
              id: 4
            name: shoichimasuhara
delete_null_flag: 1
         comment: 私はたぶん3人目だと思うから。
3 rows in set (0.00 sec)