创建mysql的表怎么显示00_Mysql sql_mode设置 timestamp default 0000-00-00 00:00:00 创建表失败处理...
往數(shù)據(jù)庫里創(chuàng)建新表的時(shí)候報(bào)錯(cuò):
[Err] 1067 - Invalid default value for 'updateTime'
DROP TABLE IF EXISTS `passwd_reset`;
CREATE TABLE `passwd_reset` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`staffId` int(11) DEFAULT NULL,
`toEmail` varchar(50) DEFAULT NULL,
`token` varchar(100) DEFAULT NULL,
`validTime` int(11) DEFAULT NULL,
`createTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`updateTime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=gbk;
mysql5.7默認(rèn)為
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
改為
sql_mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
這樣之前插入語句就能正常執(zhí)行了
sql_mode 常用值說明
官方手冊專門有一節(jié)介紹?https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html?。 SQL Mode 定義了兩個(gè)方面:MySQL應(yīng)支持的SQL語法,以及應(yīng)該在數(shù)據(jù)上執(zhí)行何種確認(rèn)檢查。
SQL語法支持類
ONLY_FULL_GROUP_BY
對于GROUP BY聚合操作,如果在SELECT中的列、HAVING或者ORDER BY子句的列,沒有在GROUP BY中出現(xiàn),那么這個(gè)SQL是不合法的。是可以理解的,因?yàn)椴辉?group by 的列查出來展示會(huì)有矛盾。 在5.7中默認(rèn)啟用,所以在實(shí)施5.6升級(jí)到5.7的過程需要注意:
ANSI_QUOTES
啟用 ANSI_QUOTES 后,不能用雙引號(hào)來引用字符串,因?yàn)樗唤忉尀樽R(shí)別符,作用與 ` 一樣。
設(shè)置它以后,update t set f1="" ...,會(huì)報(bào) Unknown column ‘’ in ‘field list 這樣的語法錯(cuò)誤。
PIPES_AS_CONCAT
將 || 視為字符串的連接操作符而非 或 運(yùn)算符,這和Oracle數(shù)據(jù)庫是一樣的,也和字符串的拼接函數(shù) CONCAT() 相類似
NO_TABLE_OPTIONS
使用 SHOW CREATE TABLE 時(shí)不會(huì)輸出MySQL特有的語法部分,如 ENGINE ,這個(gè)在使用 mysqldump 跨DB種類遷移的時(shí)候需要考慮
NO_AUTO_CREATE_USER
字面意思不自動(dòng)創(chuàng)建用戶。在給MySQL用戶授權(quán)時(shí),我們習(xí)慣使用 GRANT ... ON ... TO dbuser順道一起創(chuàng)建用戶。設(shè)置該選項(xiàng)后就與oracle操作類似,授權(quán)之前必須先建立用戶。5.7.7開始也默認(rèn)了。
數(shù)據(jù)檢查類
NO_ZERO_DATE
認(rèn)為日期 ‘0000-00-00’ 非法,與是否設(shè)置后面的嚴(yán)格模式有關(guān)。 1.如果設(shè)置了嚴(yán)格模式,則 NO_ZERO_DATE 自然滿足。但如果是 INSERT IGNORE 或 UPDATE IGNORE,’0000-00-00’依然允許且只顯示warning 2.如果在非嚴(yán)格模式下,設(shè)置了NO_ZERO_DATE,效果與上面一樣,’0000-00-00’允許但顯示warning;如果沒有設(shè)置NO_ZERO_DATE,no warning,當(dāng)做完全合法的值。 3.NO_ZERO_IN_DATE情況與上面類似,不同的是控制日期和天,是否可為 0 ,即 2010-01-00 是否合法。
NO_ENGINE_SUBSTITUTION
使用 ALTER TABLE或CREATE TABLE 指定 ENGINE 時(shí), 需要的存儲(chǔ)引擎被禁用或未編譯,該如何處理。啟用NO_ENGINE_SUBSTITUTION時(shí),那么直接拋出錯(cuò)誤;不設(shè)置此值時(shí),CREATE用默認(rèn)的存儲(chǔ)引擎替代,ATLER不進(jìn)行更改,并拋出一個(gè) warning。
STRICT_TRANS_TABLES
設(shè)置它,表示啟用嚴(yán)格模式。
注意 STRICT_TRANS_TABLES 不是幾種策略的組合,單獨(dú)指 INSERT、UPDATE出現(xiàn)少值或無效值該如何處理:
1.把 ‘’ 傳給int,嚴(yán)格模式下非法,若啟用非嚴(yán)格模式則變成0,產(chǎn)生一個(gè)warning
2.Out Of Range,變成插入最大邊界值
3.A value is missing when a new row to be inserted does not contain a value for a non-NULL column that has no explicit DEFAULT clause in its definition
上面并沒有囊括所有的 SQL Mode,選了幾個(gè)代表性的。
sql_mode一般來說很少去關(guān)注它,沒有遇到實(shí)際問題之前不會(huì)去啟停上面的條目。我們常設(shè)置的 sql_mode 是 ANSI、STRICT_TRANS_TABLES、TRADITIONAL,ansi和traditional是上面的幾種組合。
ANSI:更改語法和行為,使其更符合標(biāo)準(zhǔn)SQL
相當(dāng)于REAL_AS_FLOAT, PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE
TRADITIONAL:更像傳統(tǒng)SQL數(shù)據(jù)庫系統(tǒng),該模式的簡單描述是當(dāng)在列中插入不正確的值時(shí)“給出錯(cuò)誤而不是警告”。
相當(dāng)于 STRICT_TRANS_TABLES, STRICT_ALL_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION
ORACLE:相當(dāng)于 PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USE 無論何種mode,產(chǎn)生error之后就意味著單條sql執(zhí)行失敗,對于支持事務(wù)的表,則導(dǎo)致當(dāng)前事務(wù)回滾;但如果沒有放在事務(wù)中執(zhí)行,或者不支持事務(wù)的存儲(chǔ)引擎表,則可能導(dǎo)致數(shù)據(jù)不一致。MySQL認(rèn)為,相比直接報(bào)錯(cuò)終止,數(shù)據(jù)不一致問題更嚴(yán)重。于是 STRICT_TRANS_TABLES 對非事務(wù)表依然盡可能的讓寫入繼續(xù),比如給個(gè)”最合理”的默認(rèn)值或截?cái)唷6鴮τ?STRICT_ALL_TABLES,如果是單條更新,則不影響,但如果更新的是多條,第一條成功,后面失敗則會(huì)出現(xiàn)部分更新。
5.6.6 以后版本默認(rèn)就是NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,5.5默認(rèn)為 ‘’ 。
設(shè)置 sql_mode
查看
查看當(dāng)前連接會(huì)話的sql模式:
mysql> select @@session.sql_mode;
或者從環(huán)境變量里取
mysql> show variables like "sql_mode";
查看全局sql_mode設(shè)置:
mysql> select @@global.sql_mode;
只設(shè)置global,需要重新連接進(jìn)來才會(huì)生效
設(shè)置
mysql> set sql_mode='';
mysql> set global sql_mode='NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES';
如果是自定義的模式組合,可以像下面這樣
Adding only one mode to sql_mode without removing existing ones:
mysql> SET sql_mode=(SELECT CONCAT(@@sql_mode,','));
Removing only a specific mode from sql_mode without removing others:
mysql> SET sql_mode=(SELECT REPLACE(@@sql_mode,'',''));
配置文件里面設(shè)置
sql_mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
把sql_mode修改好之后,可以正常執(zhí)行腳本。
二. sql文件中timestamp為什么去掉了default current_timestamp?
發(fā)現(xiàn)在新版的sql文件中所有的timestamp字段都去掉了default current_timestamp
在MySQL 5.7版本建表提示出錯(cuò),因?yàn)镸ySQL 5.7 SQL_MOD默認(rèn)是strict
原因:太多低于5.7版本的人反饋報(bào)錯(cuò)就去掉了
三.??Mysql 5.7 timestamp
Mysql 5.7 timestamp 創(chuàng)建時(shí)必須設(shè)置每個(gè)時(shí)間戳類型的默認(rèn)值,否則報(bào)錯(cuò)Error : Invalid default value for 'start_time'
之前版本 默認(rèn)第一個(gè)時(shí)間戳字段為defult current_timestamp,且只能設(shè)置一個(gè)默認(rèn)為當(dāng)前時(shí)間
鏈接:https://www.jianshu.com/p/75f06beca977
原文:https://blog.csdn.net/achuo/article/details/54618990
總結(jié)
以上是生活随笔為你收集整理的创建mysql的表怎么显示00_Mysql sql_mode设置 timestamp default 0000-00-00 00:00:00 创建表失败处理...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: aticwd32.exe进程是安全的吗
- 下一篇: mysql 多条记录选择一套_2020-