校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > MySQL 如何處理隱式默認(rèn)值

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

熱門標(biāo)簽:北京人工外呼系統(tǒng)價錢 云南語音外呼系統(tǒng)平臺 400電話鄭州申請 沃克斯電梯外呼線路圖 地圖標(biāo)注被騙三百怎么辦 福州呼叫中心外呼系統(tǒng)哪家好 常州電銷外呼系統(tǒng)一般多少錢 天智外呼系統(tǒng) 房產(chǎn)智能外呼系統(tǒng)品牌

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

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

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

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

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

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

對于將數(shù)據(jù)輸入沒有顯式DEFAULT子句的NOT NULL列的情況,如果INSERT或REPLACE語句不包含該列的值,或者UPDATE語句將該列設(shè)置為NULL,屆時則MySQL將根據(jù)有效的SQL Mode處理該列:
·如果啟用了嚴(yán)格的SQL模式(strict SQL mode),則事務(wù)表將發(fā)生錯誤,并且該語句將回滾。對于非事務(wù)表,會發(fā)生錯誤,但是如果此錯誤發(fā)生在多行語句的第二行或后續(xù)行中,則該錯誤之前的所有行均已插入。
·如果未啟用嚴(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下,下面的語句都會產(chǎn)生錯誤,插入失敗。

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>

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

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)值的詳細內(nèi)容,更多關(guān)于MySQL 隱式默認(rèn)值的資料請關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • mysql查詢的時候給字段賦默認(rèn)值操作
  • 詳解Mysql數(shù)據(jù)庫date, datetime類型設(shè)置0000-00-00默認(rèn)值(default)報錯問題
  • MySQL5.7中的sql_mode默認(rèn)值帶來的坑及解決方法
  • mysql中datetime類型設(shè)置默認(rèn)值方法
  • MySQL命令行中給表添加一個字段(字段名、是否為空、默認(rèn)值)
  • Mysql select語句設(shè)置默認(rèn)值的方法
  • 解析MySQL設(shè)置當(dāng)前時間為默認(rèn)值的方法
  • MySQL表字段設(shè)置默認(rèn)值(圖文教程及注意細節(jié))
  • Mysql 5.6 "隱式轉(zhuǎn)換"導(dǎo)致的索引失效和數(shù)據(jù)不準(zhǔn)確的問題
  • 解析MySQL隱式轉(zhuǎn)換問題
  • MySQL的隱式類型轉(zhuǎn)換整理總結(jié)

標(biāo)簽:徐州 鹽城 拉薩 黔東 移動 珠海 沈陽 沈陽

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MySQL 如何處理隱式默認(rèn)值》,本文關(guān)鍵詞  MySQL,如何,處理,隱式,默認(rèn)值,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《MySQL 如何處理隱式默認(rèn)值》相關(guān)的同類信息!
  • 本頁收集關(guān)于MySQL 如何處理隱式默認(rèn)值的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 江西省| 天长市| 金乡县| 望奎县| 新建县| 米易县| 三门县| 东方市| 武穴市| 玛多县| 喀喇沁旗| 榆中县| 福贡县| 康保县| 大港区| 苏尼特左旗| 沾化县| 宿迁市| 策勒县| 韶关市| 江门市| 蕲春县| 岳池县| 迁西县| 东山县| 尼勒克县| 南华县| 永吉县| 临夏县| 怀仁县| 那曲县| 灯塔市| 河曲县| 平顶山市| 连平县| 娄烦县| 崇州市| 滕州市| 巨鹿县| 石棉县| 孙吴县|