私は、次の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)
:
はsqlfiddle証明への参照のためにこの回答を参照してください。そして、それは働いていないようです。 –
問題のテーブルがmyisamの場合、sqlmodeは依然として厳密ではありません。 "STRICT_TRANS_TABLES"はトランザクションエンジンにのみ適用されます。 myisamまたは非トランザクションの場合は、STrIcT_ALL_TABLESを有効にしてみてください。 –
'show create table'コマンドの出力からわかるように、このテーブルはMYISAMエンジンではなくInnoDBを使用しています。 Btw、あなたのデータベースで私のケースを試してみましたか?それは動作しますか? –