中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL數據庫中的隱式默認值是如何處理的

發布時間:2020-12-17 16:43:21 來源:億速云 閱讀:218 作者:Leah 欄目:開發技術

MySQL數據庫中的隱式默認值是如何處理的?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

大概情況是,從庫是用mysqldump導出導入數據的方式創建的。創建成功后,在用mysqldump驗證主從的表結構是否一致的時候,發現有些表定義不一致:

MySQL數據庫中的隱式默認值是如何處理的

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

懷疑環境被人人為修改過,但是最終確認環境沒有被動過。然后又做了一邊測試,使用mysqldump導出數據,使用source將數據導入從庫后,發現還是有這個現象,問是不是source命令有bug!

其實,這個跟MySQL內部如何處理隱式默認值有關。

如果數據類型沒有包含顯式的default值,MySQL會按照如下的規則確定默認值:
·如果該列可以采用NULL值作為值,該列在定義的時候會被加上一個顯式的default null子句
·如果該列不可以采用NULL值作為值,該列在定時候就不會加上一個顯式的default子句

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

假設表t定義如下:

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

這里,i沒有顯式的默認值。
在嚴格的sql mode下,下面的語句都會產生錯誤,插入失敗。

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>

在非嚴格的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>

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

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數據庫中的隱式默認值是如何處理的的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

安西县| 新营市| 清徐县| 和顺县| 揭西县| 义乌市| 馆陶县| 辽宁省| 扶余县| 莱州市| 阿瓦提县| 栾川县| 瓦房店市| 马尔康县| 侯马市| 重庆市| 太和县| 百色市| 罗城| 乳山市| 潼关县| 永济市| 绥滨县| 江阴市| 青田县| 文登市| 武夷山市| 韶山市| 商水县| 郯城县| 安庆市| 新余市| 锡林郭勒盟| 英山县| 金坛市| 社会| 措勤县| 邵东县| 龙井市| 东丽区| 樟树市|