情景描述
- 完成sql文件妨猩,創(chuàng)建mysql table
CREATE TABLE IF NOT EXISTS growthNote ( id INT(11) PRIMARY KEY AUTO_INCREMENT, createTime TIMESTAMP, date TIMESTAMP, title VARCHAR(225) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, content VARCHAR(225) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, author INT(11) NOT NULL, rawId INT(11) NOT NULL, operationType ENUM ('CREATE', 'UPDATE', 'DELETE') NOT NULL ) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_bin;
- 然后執(zhí)行
./gradlew flywayMigrate
- 報錯:
Invalid default value for 'date'
矛盾點
- why:沒有給date設置過default value ,為什么會爆錯說
Invalid default value
迅耘? - why: 如果說默認值無效,那么是否是mysql給了他默認值号涯,然后給的值無效绕娘?
- 為什么mysql要給他默認值亡驰?
- 為什么是在創(chuàng)建table的時候就給了晓猛?
- 那么mysql會給別的字段默認值嗎?
- why:為什么跟他同一個類型的timestamp類型沒有爆出同樣的問題凡辱?
問題解決
Q1:TIMESTAMP類型是否數據庫會給他設置一個default value(當沒有顯示設置的時候)戒职?如果是,值是什么透乾?
-
A1:默認值一定會設置洪燥,并且mysql還會給TIMESTAMP類型設置不同的默認值。(以下前提:針對你沒有給該字段設置過任何默認值乳乌,并且僅僅針對5.7版本mysql)
- 針對mysql中的第一個TIMESTAMP字段:
- mysql會自動根據當前時間產生一個VARCHAR(14)的值放入該字段作為數值捧韵。
- 并且會設置
on update current_timestamp
:意思是當某條記錄update的時候,這個字段的值會根據當前的時間產生時間戳更新這個字段的值汉操。
- 針對mysql中的非第一個TIMESTAMP字段再来,并且沒有設置default和其他任何限制的時候:
- mysql自動為他生成一個
0000-00-00 00:00:00
作為值。 - 因此mysql會自動為timeStamp字段設置default值的磷瘤。
- mysql自動為他生成一個
- 針對mysql中的第一個TIMESTAMP字段:
-
Q2:那么createTime被設置current-time當默認值芒篷,date被設置了
0000-00-00 00:00:00
當默認值搜变,那么為什么第二個默認值會報錯呢?- 這取決于你使用的mysql版本了(經過我的測試):
- 5.7版本:
- 數據庫使用嚴格模式
- 會依照question1的方式給TIMESTAMP和DATE類型設置默認值
- 但是sql_mode要求TABEL NO_ZERO_DATE因此梭伐,默認設置的
0000-00-00 00:00:00
會被認為是ZERO_DATE。所以數據庫創(chuàng)建失敗仰担。
- 5.7.8版本:
- 數據庫不會自動給TIMESTAMP字段設置默認值糊识。
- 如果INSERT沒有添加數值,就會在字段中插入NULL
- 并且create table的時候沒有給TIMESTAMP設置默認值也可以成功摔蓝。
- 5.7版本:
- 這取決于你使用的mysql版本了(經過我的測試):
Q3:那么針對5.7版本數據庫赂苗,如果我不設置TimeStamp字段是NOT_NULL是不是說數據庫就不會給字段設置
0000-00-00 00:00:00
而是當沒有值的時候設置為null?-
A3:
- mysql:5.7
- TIMESTAMP和DATE設置了默認的限制NOT_NULL,因此不論你寫不寫NOT—NULL這個限制都存在。并且都會賦予默認值
0000-00-00 00:00:00
贮尉。
- TIMESTAMP和DATE設置了默認的限制NOT_NULL,因此不論你寫不寫NOT—NULL這個限制都存在。并且都會賦予默認值
- mysql:5.7.8
- TIMESTAMP和DATE可以為NULL拌滋,并且mysql也不會自動設置默認值給這些字段。
------> 對于5.7版本猜谚,你根本不需要為TIMESTAMP和DATE字段設置NOT—NULL字段败砂,人家自帶
- mysql:5.7
Q4:那么如何解決這個問題呢?
-
A4:針對mysql:5.7
- 設置:DEFAULT "2017-9-10"
針對mysql:5.7.8
- 如果不要求NOT_NULL,那么不需要設置