日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MYSQL timestamp NOT NULL插入NULL的报错问题

發(fā)布時(shí)間:2025/3/20 数据库 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MYSQL timestamp NOT NULL插入NULL的报错问题 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. 在開發(fā)兩個(gè)數(shù)據(jù)庫數(shù)據(jù)同步功能的時(shí)候,需要在本地搭建一個(gè)本地的數(shù)據(jù)庫作為一個(gè)本地庫,然后用于同步開發(fā)庫中的數(shù)據(jù)。在插入的時(shí)候出現(xiàn)了一個(gè)問題。

問題描述:

? ? 我們每張表中都會(huì)存在一個(gè)create_time 以及update_time兩個(gè)字段。該兩個(gè)字段的定義如下:

`create_date` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建日期',`update_date` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新時(shí)間',

  其中創(chuàng)建時(shí)間采用timestamp類型并且其默認(rèn)值為CURRENT_TIMESTAMP。

? ? 當(dāng)我向數(shù)據(jù)庫中插入一條數(shù)據(jù)的時(shí)候,create_time與Update_time設(shè)置為null的時(shí)候,開發(fā)庫中會(huì)走默認(rèn)值,但是本地庫并不會(huì),并且報(bào)錯(cuò)“create_time” cannot be null

問題解決:

查詢google后發(fā)現(xiàn)

MySql系統(tǒng)變量explicit_defaults_for_timestamp: 該變量的作用為:

查看了一下解釋

大概是這么說的:

當(dāng)你設(shè)置為false的時(shí)候:

  • 未明確聲明為NULL屬性的TIMESTAMP列被分配為NOT NULL屬性。 (其他數(shù)據(jù)類型的列,如果未顯式聲明為NOT NULL,則允許NULL值。)將此列設(shè)置為NULL將其設(shè)置為當(dāng)前時(shí)間戳。
  • 表中的第一個(gè)TIMESTAMP列(如果未聲明為NULL屬性或顯式DEFAULT或ON UPDATE子句)將自動(dòng)分配DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP屬性。
  • 第一個(gè)之后的TIMESTAMP列(如果未聲明為NULL屬性或顯式DEFAULT子句)將自動(dòng)分配DEFAULT'0000-00-00 00:00:00'(“零”時(shí)間戳)。 對于不指定此列的顯式值的插入行,該列將分配“0000-00-00 00:00:00”,并且不會(huì)發(fā)生警告。

當(dāng)你設(shè)置為true的時(shí)候:

  • 未明確聲明為NOT NULL的TIMESTAMP列允許NULL值。 將此列設(shè)置為NULL將其設(shè)置為NULL,而不是當(dāng)前時(shí)間戳。
  • 沒有TIMESTAMP列自動(dòng)分配DEFAULT CURRENT_TIMESTAMP或ON UPDATE CURRENT_TIMESTAMP屬性。 必須明確指定這些屬性。
  • 聲明為NOT NULL且沒有顯式DEFAULT子句的TIMESTAMP列被視為沒有默認(rèn)值。 對于不為此列指定顯式值的插入行,結(jié)果取決于SQL模式。 如果啟用了嚴(yán)格的SQL模式,則會(huì)發(fā)生錯(cuò)誤。 如果未啟用嚴(yán)格的SQL模式,則會(huì)為列分配隱式默認(rèn)值“0000-00-00 00:00:00”,并發(fā)出警告。 這類似于MySQL如何處理其他時(shí)間類型,如DATETIME。

查看我的本地庫,發(fā)現(xiàn)我的my.cnf文件上居然加上了一個(gè)這么個(gè)玩意:

[client] port=3306 default-character-set=utf8[mysqld] #解壓目錄 basedir=D:\MYSQL\ #解壓目錄下data目錄 datadir=D:\MYSQL\data port=3306 character_set_server=utf8 #導(dǎo)出mysql數(shù)據(jù)的目錄 secure_file_priv = D:\MYSQL\data sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES #開啟查詢緩存 explicit_defaults_for_timestamp=true skip-grant-tables[WinMySQLAdmin] D:\MYSQL\mysqld.exe

  

后悔后悔,沒有好好看配置啊。直接copy。。。。

?

問題總結(jié):
  1. timestamp如果想設(shè)置為not null,則必須要設(shè)置默認(rèn)值。建議設(shè)置為當(dāng)前時(shí)間即可

? ? ? ?2.?explicit_defaults_for_timestamp 這個(gè)參數(shù)已經(jīng)在5.6版本已經(jīng)棄用了,不建議采用該配置了

? ? ? ?3. 好好看配置文件,不要亂copy

?

總結(jié)

以上是生活随笔為你收集整理的MYSQL timestamp NOT NULL插入NULL的报错问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。