[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モードが有効な場合にはエラーにしてほしいですね。要注意です。
参照ドキュメント: