2016-08-29 4 views
0

私は、次のMySQLのテーブルを持っている:alter tableは、デフォルト値の指定をしないで、空ではない新しいvarcharカラムに値を設定するのはなぜですか?

| customers | CREATE TABLE `customers` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 
COLLATE=utf8_unicode_ci | 

の表は、すでに2つの行があります

+----+-----------+ 
| id | name  | 
+----+-----------+ 
| 1 | John Woo | 
| 3 | Maria Loo | 
+----+-----------+ 
2 rows in set (0.00 sec) 

私は、次の文を使用してテーブルを変更しようとしています:

alter table customers add column (identity varchar(32) not null); 

私は私はデフォルト値を指定せず、テーブルにはすでにいくつかの行があるため、このステートメントは失敗すると考えられます。しかし、それはしません。代わりに、列を追加し、その新しい 列の値として''を既存のすべての行に設定します。

+----+-----------+----------+ 
| id | name  | identity | 
+----+-----------+----------+ 
| 1 | John Woo |   | 
| 3 | Maria Loo |   | 
+----+-----------+----------+ 
2 rows in set (0.00 sec) 

私は期待どおりの動作をさせる方法はありますか? MySQLサーバの設定変数で設定できるものがあると思います。しかし、私は確信していません。

助けが必要ですか?

更新strictモードがONすでにあることを注:

mysql> show variables where variable_name like '%mode%'; 
+--------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ 
| Variable_name   | Value                                   | 
+--------------------------+---------------------------------------------------------------------------------------------------------------------- ---------------------+ 
| block_encryption_mode | aes-128-ecb                                 | 
| gtid_mode    | OFF                                  | 
| innodb_autoinc_lock_mode | 1                                   | 
| innodb_strict_mode  | ON                                  | 
| offline_mode    | OFF                                  | 
| pseudo_slave_mode  | OFF                                  | 
| rbr_exec_mode   | STRICT                                 | 
| slave_exec_mode   | STRICT                                 | 
| sql_mode     | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | 
+--------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ 
9 rows in set (0.00 sec) 

答えて

0

理由は、strictモードがデータベースに対して発行されたDMLのために施行されていることであるように思われます。 DDLはDML機構を経由しません。なぜこのように振る舞うのですか?推測 - データベースの所有者が列をnullにしたくない場合、所有者が明示的なデフォルトを提供していない場合、暗黙的なデフォルト機能で行うことができる、所有者の意図に準拠するためにデータベースが最善を尽くしています。私はすでにstrictモードが有効になっている

MySQL add a NOT NULL column

+0

はsqlfiddle証明への参照のためにこの回答を参照してください。そして、それは働いていないようです。 –

+0

問題のテーブルがmyisamの場合、sqlmodeは依然として厳密ではありません。 "STRICT_TRANS_TABLES"はトランザクションエンジンにのみ適用されます。 myisamまたは非トランザクションの場合は、STrIcT_ALL_TABLESを有効にしてみてください。 –

+0

'show create table'コマンドの出力からわかるように、このテーブルはMYISAMエンジンではなくInnoDBを使用しています。 Btw、あなたのデータベースで私のケースを試してみましたか?それは動作しますか? –

関連する問題