最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2024年09月09日 10:51:35   作者:Bing@DBA  
在MySQL數(shù)據(jù)庫遷移過程中,explicit_defaults_for_timestamp參數(shù)設(shè)置為off可能導(dǎo)致數(shù)據(jù)寫入行為變化,本文就來介紹一下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 類型的字段如果沒有設(shè)置 null 將會(huì)自動(dòng)加上 not null 和默認(rèn)值。如果設(shè)置了默認(rèn)值,則會(huì)自動(dòng)加上 not null,其他類型的字段是不會(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ì)影響寫入。雖然 timestamp 是 not null 我們寫入 null 后變?yōu)榱?CURRENT_TIMESTAMP。

如果此時(shí)將參數(shù)設(shè)置為 1,執(zhí)行相同的 SQL 語句則會(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è)剛才的建表語句:

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ù)開啟的情況下,MySQL 默認(rèn)會(huì)為 timestamp 為 NULL 的字段添加 default null 屬性。而且 MySQL 沒有為第一個(gè) timestamp 設(shè)置默認(rèn)值,當(dāng)我寫入 null 后,則按照 null 來存儲(chǔ)。

另外,如果 timestamp 設(shè)置為 not null 那么寫入 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 語句,有沒有直接圖省事插入 null 表示當(dāng)前時(shí)間,如果有這種不規(guī)范的語法,那么調(diào)整該參數(shù)后,可能會(huì)報(bào)錯(cuò)。

云平臺(tái)一般不會(huì)給用戶 super 賬號(hào),所以在遷移過程中,可能無法設(shè)置 session 級(jí)別的參數(shù),此時(shí)建議跳過該校驗(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事務(wù)特性與自動(dòng)提交

    深入理解MySQL事務(wù)特性與自動(dòng)提交

    事務(wù)以及事務(wù)隔離機(jī)制,其實(shí)是所有關(guān)系型數(shù)據(jù)庫都有的問題,本文主要介紹了深入理解MySQL事務(wù)特性與自動(dòng)提交,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-07-07
  • Mysql內(nèi)置函數(shù)的實(shí)現(xiàn)示例

    Mysql內(nèi)置函數(shù)的實(shí)現(xiàn)示例

    mysql內(nèi)置了很多的函數(shù),本文主要介紹了Mysql內(nèi)置函數(shù)的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • mysql的約束及實(shí)例分析

    mysql的約束及實(shí)例分析

    這篇文章主要介紹了mysql的約束及實(shí)例分析,真正約束字段的是數(shù)據(jù)類型,但是數(shù)據(jù)類型約束很單一,需要有一些額外的約束,更好的保證數(shù)據(jù)的合法性,從業(yè)務(wù)邏輯角度保證數(shù)據(jù)的正確性,需要的朋友可以參考下
    2023-07-07
  • MySQL數(shù)據(jù)庫自動(dòng)化備份腳本的實(shí)踐指南

    MySQL數(shù)據(jù)庫自動(dòng)化備份腳本的實(shí)踐指南

    數(shù)據(jù)是企業(yè)的核心資產(chǎn),定期備份數(shù)據(jù)庫是每個(gè)運(yùn)維和開發(fā)人員的必修課,本文分享一個(gè)生產(chǎn)環(huán)境驗(yàn)證過的 MySQL 自動(dòng)備份腳本,支持多數(shù)據(jù)庫備份、自動(dòng)壓縮、過期清理,并詳細(xì)解讀每一處細(xì)節(jié),幫助你快速搭建可靠的備份體系,需要的朋友可以參考下
    2026-04-04
  • Mysql查詢時(shí)如何使用for update行鎖還是表鎖

    Mysql查詢時(shí)如何使用for update行鎖還是表鎖

    這篇文章主要介紹了Mysql查詢時(shí)如何使用for update行鎖還是表鎖問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • MySQL如何將一個(gè)表的字段更新到另一個(gè)表中

    MySQL如何將一個(gè)表的字段更新到另一個(gè)表中

    在數(shù)據(jù)庫管理中,經(jīng)常需要將一個(gè)表中的數(shù)據(jù)更新到另一個(gè)表中,本文將通過幾個(gè)簡單示例為大家詳細(xì)介紹如何在MySQL中實(shí)現(xiàn)這一功能,有需要的可以參考下
    2025-01-01
  • MySql主從復(fù)制機(jī)制全面解析

    MySql主從復(fù)制機(jī)制全面解析

    這篇文章主要介紹了MySql主從復(fù)制機(jī)制全面解析的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下
    2021-04-04
  • MySQL中修改表結(jié)構(gòu)時(shí)需要注意的一些地方

    MySQL中修改表結(jié)構(gòu)時(shí)需要注意的一些地方

    這篇文章主要介紹了MySQL中修改表結(jié)構(gòu)時(shí)需要注意的一些地方,作者援引Percona的相關(guān)的說明來講述如何避免相關(guān)操作導(dǎo)致表無法使用的問題,一些需要的朋友可以參考下
    2015-06-06
  • MySQL索引失效的幾種情況詳析

    MySQL索引失效的幾種情況詳析

    這篇文章主要給大家介紹了關(guān)于MySQL索引失效的幾種情況,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 深度解析如何正確使用MySQL日期時(shí)間類型

    深度解析如何正確使用MySQL日期時(shí)間類型

    MySQL作為主流關(guān)系型數(shù)據(jù)庫,其日期時(shí)間類型的選擇策略對(duì)系統(tǒng)性能與功能實(shí)現(xiàn)至關(guān)重要,本文將從技術(shù)原理與工程實(shí)踐角度展開深度分析,感興趣的小伙伴可以了解下
    2025-06-06

最新評(píng)論

嘉定区| 涿鹿县| 通江县| 健康| 武汉市| 苍南县| 乐平市| 丰台区| 无为县| 新郑市| 子洲县| 沾化县| 克什克腾旗| 木里| 岳阳县| 凭祥市| 额济纳旗| 通榆县| 林西县| 大城县| 手游| 伊宁县| 东乌珠穆沁旗| 台东市| 方山县| 永靖县| 抚宁县| 龙陵县| 兴国县| 页游| 安西县| 彰化市| 潮安县| 四川省| 勃利县| 高雄市| 巴南区| 三亚市| 中阳县| 平江县| 育儿|