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

MySQL 如何處理隱式默認(rèn)值

 更新時(shí)間:2020年12月17日 10:20:04   作者:abce  
這篇文章主要介紹了MySQL 處理隱式默認(rèn)值的相關(guān)資料,幫助大家更好的理解和使用MySQL,感興趣的朋友可以了解下

有同學(xué)說遇到了主從不一致的問題。

大概情況是,從庫是用mysqldump導(dǎo)出導(dǎo)入數(shù)據(jù)的方式創(chuàng)建的。創(chuàng)建成功后,在用mysqldump驗(yàn)證主從的表結(jié)構(gòu)是否一致的時(shí)候,發(fā)現(xiàn)有些表定義不一致:

從他的比較結(jié)果可以看到,在從庫端,有三個(gè)列的定義中被加入了“default null”。

懷疑環(huán)境被人人為修改過,但是最終確認(rèn)環(huán)境沒有被動(dòng)過。然后又做了一邊測試,使用mysqldump導(dǎo)出數(shù)據(jù),使用source將數(shù)據(jù)導(dǎo)入從庫后,發(fā)現(xiàn)還是有這個(gè)現(xiàn)象,問是不是source命令有bug!

其實(shí),這個(gè)跟MySQL內(nèi)部如何處理隱式默認(rèn)值有關(guān)。

如果數(shù)據(jù)類型沒有包含顯式的default值,MySQL會(huì)按照如下的規(guī)則確定默認(rèn)值:
·如果該列可以采用NULL值作為值,該列在定義的時(shí)候會(huì)被加上一個(gè)顯式的default null子句
·如果該列不可以采用NULL值作為值,該列在定時(shí)候就不會(huì)加上一個(gè)顯式的default子句

對(duì)于將數(shù)據(jù)輸入沒有顯式DEFAULT子句的NOT NULL列的情況,如果INSERT或REPLACE語句不包含該列的值,或者UPDATE語句將該列設(shè)置為NULL,屆時(shí)則MySQL將根據(jù)有效的SQL Mode處理該列:
·如果啟用了嚴(yán)格的SQL模式(strict SQL mode),則事務(wù)表將發(fā)生錯(cuò)誤,并且該語句將回滾。對(duì)于非事務(wù)表,會(huì)發(fā)生錯(cuò)誤,但是如果此錯(cuò)誤發(fā)生在多行語句的第二行或后續(xù)行中,則該錯(cuò)誤之前的所有行均已插入。
·如果未啟用嚴(yán)格模式,則MySQL將列設(shè)置為列數(shù)據(jù)類型的隱式默認(rèn)值。

假設(shè)表t定義如下:

mysql> create table t(i int not null);

這里,i沒有顯式的默認(rèn)值。
在嚴(yán)格的sql mode下,下面的語句都會(huì)產(chǎn)生錯(cuò)誤,插入失敗。

mysql> show variables like '%sql_mode%';
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value                                                                                                                                     |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| 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.01 sec)
 
mysql> INSERT INTO t VALUES();
ERROR 1364 (HY000): Field 'i' doesn't have a default value
mysql> INSERT INTO t VALUES(DEFAULT);
ERROR 1364 (HY000): Field 'i' doesn't have a default value
mysql> INSERT INTO t VALUES(DEFAULT(i));
ERROR 1364 (HY000): Field 'i' doesn't have a default value
mysql>

在非嚴(yán)格的sql mode下:

mysql> SET @@sql_mode='';
Query OK, 0 rows affected, 1 warning (0.00 sec)
 
mysql> show variables like '%sql_mode%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sql_mode      |       |
+---------------+-------+
1 row in set (0.00 sec)
 
mysql> INSERT INTO t VALUES();
Query OK, 1 row affected, 1 warning (0.00 sec)
 
mysql> INSERT INTO t VALUES(DEFAULT);
Query OK, 1 row affected, 1 warning (0.01 sec)
 
mysql> INSERT INTO t VALUES(DEFAULT(i));
ERROR 1364 (HY000): Field 'i' doesn't have a default value
mysql> select * from t;
+---+
| i |
+---+
| 0 |
| 0 |
+---+
2 rows in set (0.01 sec)
 
mysql>

對(duì)于給定的表,SHOW CREATE TABLE語句顯示哪些列具有顯式的DEFAULT子句。對(duì)于隱式的默認(rèn)值定義如下:
·對(duì)于numeric類型,默認(rèn)值為0,但對(duì)于用AUTO_INCREMENT屬性聲明的整數(shù)或浮點(diǎn)類型,默認(rèn)值為序列中的下一個(gè)值。
·對(duì)于除TIMESTAMP以外的date和time類型,默認(rèn)值為該類型的"零"值。如果啟用了explicit_defaults_for_timestamp系統(tǒng)變量,對(duì)于TIMESTAMP也是如此。否則,對(duì)于表中的第一個(gè)TIMESTAMP列,默認(rèn)值為當(dāng)前日期和時(shí)間。
·對(duì)于ENUM以外的其他字符串類型,默認(rèn)值為空字符串。對(duì)于ENUM,默認(rèn)值為第一個(gè)枚舉值。

mysql> create table t1(id int,name varchar(20));
Query OK, 0 rows affected (0.04 sec)
 
mysql> show create table t1\G
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
1 row in set (0.00 sec)
 
mysql>

以上就是MySQL 如何處理隱式默認(rèn)值的詳細(xì)內(nèi)容,更多關(guān)于MySQL 隱式默認(rèn)值的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • MySQL的安裝以及基本的管理命令和設(shè)置

    MySQL的安裝以及基本的管理命令和設(shè)置

    這篇文章主要介紹了MySQL的安裝以及基本的管理命令和設(shè)置,是搭建MySQL環(huán)境的基礎(chǔ),需要的朋友可以參考下
    2015-11-11
  • MySQL8.0.30(zip版)windows安裝過程

    MySQL8.0.30(zip版)windows安裝過程

    這篇文章主要介紹了MySQL8.0.30(zip版)windows安裝,進(jìn)入到mysql下載頁面后選擇zip版本點(diǎn)擊下載,下載完以后把它解壓到自己想存放的位置,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • 詳解Mysql函數(shù)調(diào)用優(yōu)化

    詳解Mysql函數(shù)調(diào)用優(yōu)化

    這篇文章主要介紹了Mysql 函數(shù)調(diào)用優(yōu)化的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下
    2021-04-04
  • Mysql多層子查詢示例代碼(收藏夾案例)

    Mysql多層子查詢示例代碼(收藏夾案例)

    這篇文章主要介紹了Mysql多層子查詢示例代碼,以收藏夾案例給大家詳細(xì)介紹,代碼簡單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • Mysql導(dǎo)入導(dǎo)出時(shí)遇到的問題解決

    Mysql導(dǎo)入導(dǎo)出時(shí)遇到的問題解決

    這篇文章主要給大家介紹了關(guān)于Mysql導(dǎo)入導(dǎo)出時(shí)遇到問題的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Mysql具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • MySQL中的引號(hào)和反引號(hào)的區(qū)別與用法詳解

    MySQL中的引號(hào)和反引號(hào)的區(qū)別與用法詳解

    這個(gè)問題是我在學(xué)習(xí)數(shù)據(jù)庫的時(shí)候遇到的一個(gè)問題,我當(dāng)時(shí)并不能理解下圖中的一些情況,后來我也請(qǐng)教了一位大佬給我解答,最后在大佬和度娘的幫助下我大概理解了這個(gè)反引號(hào)的東西
    2021-10-10
  • mysql如何增加數(shù)據(jù)表的字段(ALTER)

    mysql如何增加數(shù)據(jù)表的字段(ALTER)

    這篇文章主要介紹了mysql如何增加數(shù)據(jù)表的字段(ALTER),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • mysql 8.0.17 安裝配置方法圖文教程

    mysql 8.0.17 安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了mysql 8.0.17 安裝配置方法圖文教程,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • 淺析MySQL的基數(shù)統(tǒng)計(jì)

    淺析MySQL的基數(shù)統(tǒng)計(jì)

    這篇文章主要介紹了MySQL的基數(shù)統(tǒng)計(jì)的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)MySQL數(shù)據(jù)庫的使用,感興趣的朋友可以了解下
    2020-11-11
  • Mysql計(jì)算n日留存率的實(shí)現(xiàn)

    Mysql計(jì)算n日留存率的實(shí)現(xiàn)

    本文主要介紹了Mysql計(jì)算n日留存率的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01

最新評(píng)論