国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

MySQL 如何處理隱式默認值

瀏覽:12日期:2023-10-07 17:21:23

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

大概情況是,從庫是用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 valuemysql> INSERT INTO t VALUES(DEFAULT);ERROR 1364 (HY000): Field ’i’ doesn’t have a default valuemysql> INSERT INTO t VALUES(DEFAULT(i));ERROR 1364 (HY000): Field ’i’ doesn’t have a default valuemysql>

在非嚴格的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 valuemysql> 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 t1G*************************** 1. row *************************** Table: t1Create Table: CREATE TABLE `t1` ( `id` int(11) DEFAULT NULL, `name` varchar(20) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8mb41 row in set (0.00 sec) mysql>

以上就是MySQL 如何處理隱式默認值的詳細內容,更多關于MySQL 隱式默認值的資料請關注好吧啦網其它相關文章!

標簽: MySQL 數據庫
相關文章:
主站蜘蛛池模板: 亚洲欧美日韩精品在线 | 久操免费在线视频 | 欧美一区二区三区视视频 | 国产精品爱久久久久久久 | 亚洲品质自拍视频 | 国产精品久久久一区二区三区 | 欧美国产合集在线视频 | 欧美成人精品一区二区 | 国产在线日韩 | 欧美精品国产精品 | 中文字幕成人网 | 中文字幕一区二区三区免费视频 | 国产成版人视频网站免费下 | 怡红院免费全部视频在线视频 | 亚洲bt欧美bt国产bt | 偷看各类wc女厕嘘在线观看 | 欧美一及片 | 欧美一级视频在线观看欧美 | 亚洲图片一区二区 | 日韩 欧美 中文 亚洲 高清 在线 | 波多野结衣一级 | 免费在线观看一区二区 | 国产一区二区三区四区五区tv | 日韩三级黄色片 | 国内精品一区二区在线观看 | 999久久| 久色福利| 成年人免费大片 | 日韩美女大全视频在线 | 天天做天天爱夜夜大爽完整 | 欧美特级一级毛片 | 91精品一区国产高清在线 | 一区二区三区四区在线播放 | 国产一区二区精品久久91 | 欧美激情视频在线观看一区二区三区 | 欧美午夜不卡 | 日本在线观看免费视频 | 综合 欧美 亚洲日本 | 国产成人无精品久久久 | 中文字幕在线观看国产 | 久久一区二区精品综合 |