一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫技術|

服務器之家 - 數(shù)據(jù)庫 - Mysql - MySQL 如何處理隱式默認值

MySQL 如何處理隱式默認值

2021-03-19 19:29abce Mysql

這篇文章主要介紹了MySQL 處理隱式默認值的相關資料,幫助大家更好的理解和使用MySQL,感興趣的朋友可以了解下

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

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

MySQL 如何處理隱式默認值

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

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

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

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

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

假設表t定義如下:

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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屬性聲明的整數(shù)或浮點類型,默認值為序列中的下一個值。
·對于除TIMESTAMP以外的date和time類型,默認值為該類型的"零"值。如果啟用了explicit_defaults_for_timestamp系統(tǒng)變量,對于TIMESTAMP也是如此。否則,對于表中的第一個TIMESTAMP列,默認值為當前日期和時間。
·對于ENUM以外的其他字符串類型,默認值為空字符串。對于ENUM,默認值為第一個枚舉值。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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 如何處理隱式默認值的詳細內容,更多關于MySQL 隱式默認值的資料請關注服務器之家其它相關文章!

原文鏈接:https://www.cnblogs.com/abclife/p/13993944.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产v在线播放 | 国产品精人成福利视频 | 不知火舞被c视频在线播放 不卡一区二区三区卡 | 精品欧美一区二区三区在线观看 | 国产激情久久久久影院小草 | 青青青手机在线视频 | 四虎www| 久久这里只有精品国产精品99 | rylskyart系列视频 | 国产91素人搭讪系列天堂 | 啊啊啊好大视频 | 国色天香社区在线 | 肉肉小说在线阅读 | 青春草在线观看视频 | 99热er| 无人在线视频高清免费播放 | xnxx动漫| 亚洲国产果果在线播放在线 | 校花的第一次好紧好爽 | 午夜影院费试看黄 | 国产成人免费a在线资源 | 国产午夜亚洲精品一区网站 | 色琪琪久久se色 | meyd–456佐山爱在线播放 | 黑白配高清hd在线视频 | 男人插曲女人下面 | 亚洲人成毛片线播放 | 我的妹妹最近有点怪在线观看 | 色综合久久中文字幕网 | 免费观看无人区完整版 | 99久久爱热6在线播放 | 欧美 亚洲 一区 | 2019天天干夜夜操 | 特级一级全黄毛片免费 | 青青草在线观看 | 久久国产乱子伦免费精品 | 久久亚洲精选 | 19+韩国女主播激情vip视频在线 | 欧美人与日本人xx在线视频 | 日韩毛片免费在线观看 | 800精品国产导航 |