■データ登録
InnoDBの8KBの壁にぶち当たったら。 - sawara.me
http://sawara.me/mysql/2219/
ダミーデータを作成する。 insert_generate_series - イノベートな非日常
http://d.hatena.ne.jp/IT7C/20140520/1400522465
■「0000-00-00 00:00:00」のデータを登録する
データ登録時に以下のエラーになった場合、
ERROR 1292 (22007) at line 2419: Incorrect datetime value: '0000-00-00 00:00:00' for column 'created' at row 10
SQLの設定を変更することで登録できるようになる
(「NO_ZERO_IN_DATE」と「NO_ZERO_DATE」の項目を削除している)
とは言え、そもそも「0000-00-00 00:00:00」というのはおかしなデータなので、可能ならデータを「1970-01-01 00:00:00」やNULLにしておく方が好ましい
# mysql -u root -p
> SELECT @@GLOBAL.sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@GLOBAL.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 |
+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
> SET GLOBAL sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
Query OK, 0 rows affected, 1 warning (0.00 sec)
> SELECT @@GLOBAL.sql_mode;
+--------------------------------------------------------------------------------------------------------------+
| @@GLOBAL.sql_mode |
+--------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
> exit
Bye
Docker環境の場合、mysqlコンテナを停止&起動すると設定がリセットされた
この場合、my.confで以下のように指定することで恒久的に対処できた
[mysqld]
character-set-server=utf8
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
[client]
default-character-set=utf8
MySQLのsql_modeのせいで'0000-00-00'登録時にエラーが出た昔話。 - Qiita
https://qiita.com/tentatsu/items/fd2177777412ebc2f6b9
【MySQL】DATE/DATETIME型の'0000-00-00'について整理してみる - Qiita
https://qiita.com/rhap/items/26b3e796c68a2adaccf5
Data truncation: Incorrect datetime value: ‘0000-00-00 00:00:00’ | DriftwoodJP
https://www.d-wood.com/blog/2020/02/20_11802.html
■代理キー管理のテーブルにINSERTする
codeが「test」のデータの代理キーをもとに挿入したい…という場合、あくまでも一例だが以下のような方法は使えるかもしれない
(いったん仮の値で登録し、後から正しい代理キーに変更する)
INSERT INTO examinations(school_id, name, sort) VALUES(99999, 'AOエントリー', 1);
INSERT INTO examinations(school_id, name, sort) VALUES(99999, 'A入試', 2);
INSERT INTO examinations(school_id, name, sort) VALUES(99999, 'B入試', 3);
INSERT INTO examinations(school_id, name, sort) VALUES(99999, '二次入試', 4);
UPDATE examinations SET school_id = (SELECT id FROM schools WHERE code='test') WHERE school_id = 99999;