アーカイブ

‘MySQL’ タグのついている投稿

[MySQL] NOT NULLかつDEFAULTなしの列を追加した場合、データタイプデフォルト値が設定される。

2009 年 9 月 15 日 コメント 16,471 件

MySQL(5.0系)で、すでにレコードが存在するテーブルにNOT NULLかつDEFAULTなしの列を追加してもエラーにならなかった。きちんと理解していないので調べておく。

以下のテーブルを作成し、レコードを追加しておく。

mysql> CREATE TABLE users (id INTEGER PRIMARY KEY);
mysql> DESC users;
+-------+---------+------+-----+---------+----------------+
| Field | Type    | Null | Key | Default | Extra          |
+-------+---------+------+-----+---------+----------------+
| id    | int(11) | NO   | PRI | NULL    |                | 
+-------+---------+------+-----+---------+----------------+
mysql> INSERT INTO users VALUES(1);

NOT NULLでDEFAULTなしの列を追加してみる。

mysql> ALTER TABLE users ADD (name VARCHAR(255) NOT NULL, 
age INTEGER NOT NULL, created_at DATETIME NOT NULL);

エラーにならず、以下の値が設定された。

mysql> SELECT * FROM USERS;
+----+------+-----+---------------------+
| id | name | age | created_at          |
+----+------+-----+---------------------+
|  1 |      |   0 | 0000-00-00 00:00:00 | 
+----+------+-----+---------------------+

どうやら「データタイプデフォルト値」が設定されるもよう。
これは「ストリクトSQLモード」が有効な場合でも同じ結果となる。試してみる。

-- いったん列を削除
mysql> ALTER TABLE users DROP name;
mysql> ALTER TABLE users DROP age;
mysql> ALTER TABLE users DROP created_at;
 
-- ストリクトSQLモードを有効に
mysql> SET sql_mode = 'STRICT_ALL_TABLES';
mysql> SELECT @@sql_mode;
+-------------------+
| @@sql_mode        |
+-------------------+
| STRICT_ALL_TABLES | 
+-------------------+
 
-- ストリクトSQLモードでもエラーにならない
mysql> ALTER TABLE users ADD (name VARCHAR(255) NOT NULL, 
age INTEGER NOT NULL, created_at DATETIME NOT NULL);
mysql> SELECT * FROM USERS;
+----+------+-----+---------------------+
| id | name | age | created_at          |
+----+------+-----+---------------------+
|  1 |      |   0 | 0000-00-00 00:00:00 | 
+----+------+-----+---------------------+

せめてストリクトSQLモードが有効な場合にはエラーにしてほしいですね。要注意です。

参照ドキュメント:

カテゴリー: 未分類 タグ:

[MySQL] int(11)の11は最大桁数ではない

2009 年 9 月 1 日