欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL遷移中explicit_defaults_for_timestamp參數(shù)影響

 更新時(shí)間:2024年09月09日 10:51:35   作者:Bing@DBA  
在MySQL數(shù)據(jù)庫(kù)遷移過(guò)程中,explicit_defaults_for_timestamp參數(shù)設(shè)置為off可能導(dǎo)致數(shù)據(jù)寫(xiě)入行為變化,本文就來(lái)介紹一下explicit_defaults_for_timestamp參數(shù)影響,感興趣的可以了解一下

前言

最近在做數(shù)據(jù)遷移的時(shí)候,使用的是云平臺(tái)自帶的同步工具,在預(yù)檢查階段,當(dāng)時(shí)報(bào)錯(cuò) explicit_defaults_for_timestamp 參數(shù)在目標(biāo)端為 off 建議修改 on,有什么風(fēng)險(xiǎn)呢?在此記錄下。

測(cè)試對(duì)比

MySQL 默認(rèn)情況下 explicit_defaults_for_timestamp = 0 我們對(duì)比一下看看。

explicit_defaults_for_timestamp = 0

在 explicit_defaults_for_timestamp 參數(shù)等于 0 的狀態(tài)下,如果第一個(gè) timestamp 類(lèi)型的字段如果沒(méi)有設(shè)置 null 將會(huì)自動(dòng)加上 not null 和默認(rèn)值。如果設(shè)置了默認(rèn)值,則會(huì)自動(dòng)加上 not null,其他類(lèi)型的字段是不會(huì)的。

create table test03 (
    a_time timestamp ,
    b_time timestamp null ,
    c_time timestamp default '2024-01-01 00:00:00',
    name varchar(2) default 'a');

show create table test03;

CREATE TABLE `test03` (
  `a_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `b_time` timestamp NULL DEFAULT NULL,
  `c_time` timestamp NOT NULL DEFAULT '2024-01-01 00:00:00',
  `name` varchar(2) DEFAULT 'a'
) ENGINE=InnoDB DEFAULT CHARSET=latin1

然后,我們嘗試插入一個(gè)記錄:

insert into test03 values (null, null, null, null);
a_timeb_timec_timename
2024-09-05 14:37:12NULL2024-09-05 14:37:12NULL

可以看到,在 explicit_defaults_for_timestamp 等于 0 的時(shí)候,不僅會(huì)影響表結(jié)構(gòu),還會(huì)影響寫(xiě)入。雖然 timestamp 是 not null 我們寫(xiě)入 null 后變?yōu)榱?CURRENT_TIMESTAMP。

如果此時(shí)將參數(shù)設(shè)置為 1,執(zhí)行相同的 SQL 語(yǔ)句則會(huì)報(bào)錯(cuò):

# 設(shè)置參數(shù)為 1
set global explicit_defaults_for_timestamp = 1;

# 插入相同的數(shù)據(jù)
insert into test03 values (null, null, null, null);

[23000][1048] Column ‘a_time’ cannot be null

explicit_defaults_for_timestamp = 1

此時(shí)在 explicit_defaults_for_timestamp 等于 1 的條件下,執(zhí)行一個(gè)剛才的建表語(yǔ)句:

create table test04 (
    a_time timestamp ,
    b_time timestamp null ,
    c_time timestamp default '2024-01-01 00:00:00',
    d_time timestamp not null );

show create table test04;

CREATE TABLE `test04` (
  `a_time` timestamp NULL DEFAULT NULL,
  `b_time` timestamp NULL DEFAULT NULL,
  `c_time` timestamp NULL DEFAULT '2024-01-01 00:00:00',
  `d_time` timestamp NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1

嘗試插入數(shù)據(jù):

insert into test04 values (null, null, null, null);
a_timeb_timec_timename
NULLNULLNULLNULL

從上面可以看到,參數(shù)開(kāi)啟的情況下,MySQL 默認(rèn)會(huì)為 timestamp 為 NULL 的字段添加 default null 屬性。而且 MySQL 沒(méi)有為第一個(gè) timestamp 設(shè)置默認(rèn)值,當(dāng)我寫(xiě)入 null 后,則按照 null 來(lái)存儲(chǔ)。

另外,如果 timestamp 設(shè)置為 not null 那么寫(xiě)入 null 時(shí)會(huì)報(bào)錯(cuò),如果 sql_mode 中不包含 SQL_MODE 的話,則存儲(chǔ)為 ‘0000-00-00 00:00:00’ 并拋出一個(gè)異常。

總結(jié)

生產(chǎn)環(huán)境 timestamp 字段一般都會(huì)設(shè)置為如下樣式,而且需要 timestamp 字段為 null 的業(yè)務(wù)場(chǎng)景很少。

`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新時(shí)間',
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時(shí)間',

如果生產(chǎn)環(huán)境,要修改這個(gè)參數(shù),從 0 調(diào)整到 1 需要關(guān)注的就是 insert 語(yǔ)句,有沒(méi)有直接圖省事插入 null 表示當(dāng)前時(shí)間,如果有這種不規(guī)范的語(yǔ)法,那么調(diào)整該參數(shù)后,可能會(huì)報(bào)錯(cuò)。

云平臺(tái)一般不會(huì)給用戶 super 賬號(hào),所以在遷移過(guò)程中,可能無(wú)法設(shè)置 session 級(jí)別的參數(shù),此時(shí)建議跳過(guò)該校驗(yàn),不修改全局級(jí)別的參數(shù)。

到此這篇關(guān)于MySQL 遷移中 explicit_defaults_for_timestamp參數(shù)影響的文章就介紹到這了,更多相關(guān)MySQL explicit_defaults_for_timestamp參數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MYSQL初學(xué)者命令行使用指南

    MYSQL初學(xué)者命令行使用指南

    其實(shí)MYSQL的對(duì)數(shù)據(jù)庫(kù)的操作與其它的SQL類(lèi)數(shù)據(jù)庫(kù)大同小異,您最好找本將SQL的書(shū)看看。我在這里只介紹一些基本的,其實(shí)我也就只懂這些了,呵呵。最好的MYSQL教程還是“晏子“譯的“MYSQL中文參考手冊(cè)“不僅免費(fèi)每個(gè)相關(guān)網(wǎng)站都有下載,而且它是最權(quán)威的。
    2008-06-06
  • 淺談MySQL存儲(chǔ)引擎選擇 InnoDB與MyISAM的優(yōu)缺點(diǎn)分析

    淺談MySQL存儲(chǔ)引擎選擇 InnoDB與MyISAM的優(yōu)缺點(diǎn)分析

    MyISAM 是MySQL中默認(rèn)的存儲(chǔ)引擎,一般來(lái)說(shuō)不是有太多人關(guān)心這個(gè)東西。決定使用什么樣的存儲(chǔ)引擎是一個(gè)很tricky的事情,但是還是值我們?nèi)パ芯恳幌?,這里的文章只考慮 MyISAM 和InnoDB這兩個(gè),因?yàn)檫@兩個(gè)是最常見(jiàn)的
    2013-06-06
  • 淺談Mysql8和mysql5.7的區(qū)別

    淺談Mysql8和mysql5.7的區(qū)別

    本文主要介紹了Mysql8和mysql5.7的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • MySQL8.0數(shù)據(jù)庫(kù)開(kāi)窗函數(shù)圖文詳解

    MySQL8.0數(shù)據(jù)庫(kù)開(kāi)窗函數(shù)圖文詳解

    開(kāi)窗函數(shù)為將要被操作的行的集合定義一個(gè)窗口,它對(duì)一組值進(jìn)行操作,不需要使用GROUP BY子句對(duì)數(shù)據(jù)進(jìn)行分組,能夠在同一行中同時(shí)返回基礎(chǔ)行的列和聚合列,這篇文章主要給大家介紹了關(guān)于MySQL8.0數(shù)據(jù)庫(kù)開(kāi)窗函數(shù)的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • 詳解MySQL8.0 密碼過(guò)期策略

    詳解MySQL8.0 密碼過(guò)期策略

    這篇文章主要介紹了MySQL8.0 密碼過(guò)期策略的相關(guān)資料,幫助大家更好的理解和使用MySQL8.0的新功能,感興趣的朋友可以了解下
    2020-11-11
  • MySQL在grant時(shí)報(bào)錯(cuò)ERROR?1064?(42000)的原因及解決方法

    MySQL在grant時(shí)報(bào)錯(cuò)ERROR?1064?(42000)的原因及解決方法

    網(wǎng)上查到的grant方式大多會(huì)報(bào)錯(cuò),主要原因是MySQL版本8.0后不能再使用原來(lái)的方式,這篇文章主要介紹了MySQL在grant時(shí)報(bào)錯(cuò)ERROR?1064?(42000),需要的朋友可以參考下
    2022-08-08
  • MySQL 數(shù)據(jù)類(lèi)型詳情

    MySQL 數(shù)據(jù)類(lèi)型詳情

    這篇文章主要介紹了MySQL 數(shù)據(jù)類(lèi)型,數(shù)值類(lèi)型分類(lèi)又分嚴(yán)格數(shù)值類(lèi)型和近似數(shù)值數(shù)據(jù)類(lèi)型,下面文章圍繞MySQL 數(shù)據(jù)類(lèi)型展開(kāi)內(nèi)容,需要的朋友可以參考一下
    2021-11-11
  • 解決mysql登錄錯(cuò)誤:''Access denied for user ''root''@''localhost''

    解決mysql登錄錯(cuò)誤:''Access denied for user ''root''@''localhost''

    這篇文章主要介紹了mysql登錄錯(cuò)誤:'Access denied for user 'root'@'localhost',本文給出了操作過(guò)程及注意事項(xiàng),需要的朋友可以參考下
    2019-11-11
  • php中關(guān)于mysqli和mysql區(qū)別的一些知識(shí)點(diǎn)分析

    php中關(guān)于mysqli和mysql區(qū)別的一些知識(shí)點(diǎn)分析

    看書(shū)、看視頻的時(shí)候一直沒(méi)有搞懂mysqli和mysql到底有什么區(qū)別。于是今晚“谷歌”一番,整理一下。需要的朋友可以參考下。
    2011-08-08
  • mysql查詢的控制語(yǔ)句圖文詳解

    mysql查詢的控制語(yǔ)句圖文詳解

    這篇文章主要給大家介紹了關(guān)于mysql查詢控制語(yǔ)句的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04

最新評(píng)論