一 mysql8概述
在研究mysql8新特性的時候,越來越感覺mysql8朝sql server看齊。看來對於中小型企業級應用也挺有興趣,但是沒有企業級的應用套件,有知道的麻煩告知。本文不探討mysql8的結構變化,函數變化,
以及新增的功能。僅僅闡述下mysql8在sql語法上與標准sql的一點點區別,作為研究mysql系列文章的開篇
二 mysql8sql與標准sql的些許差異
REVOKE:在mysql刪除一個表的時候,是不自定執行revoke權限的,必須手動執行revoke
CAST:這個函數不支持轉換 REAL 和 BIGINT
SELECT INTO TABLE的語法不同:mysql不支持此語法,替換的是支持INSERT ....SELECT 和CREATEA TABLE ....SELECT和 SELECT ... INTO OUTFILE
UPDATE 不同:UPDATE t1 SET col1 = col1 + 1, col2 = col1; 這條語句的結果是col1和col2最后是同一個值,col2 = col1這條表達式,col1並沒有取源值。
三 foreign key 的不同
1 ,如果子表引用父表的值,在父表中有多行,那么這些行是都不能刪除的。
2,一個外鍵可以是非唯一的鍵值。
3, ON UPDATE CASCADE or ON UPDATE SET NULL是不能自引用的,但是 ON DELETE SET NULL可以, ON DELETE CASCADE或許可以,但是嵌套是不能超過15.
4,在一個增刪改的多行的語句,外鍵約束,比如唯一約束,是一行一行的被檢查。外鍵約束檢查功能的時候,innodb設置一個共享鎖,在必須被檢查的子或者父行上。mysql立即檢查約束;檢查沒有被延遲到事務提交。語句sql標准,默認的動作應當被延遲檢查,即是,約束僅僅是被檢查在整個sql語句被處理完成后,
四 comment的不同
標准sql使用c風格的注釋: /* this is a comment */.mysql同樣支持這種樣式,同時擴展這種風格,讓mysql獨特的sql可以嵌入在注釋中,標准sql的注釋風格使用“--”開始,mysql使用#開始注釋字符。mysql也支持--注釋樣式的變種。就是 --開始,但是 必須跟隨一個space,或者一個控制字符,比如新行。space避免自動生成sql查詢的一些問題,如下例子:
UPDATE account SET credit=credit-paymet
如果payment是一個負值,比如-1,那么語句就變成:
UPDATE account SET credit=credit--1
credit--1是一個合法的表達式,但是--被解釋作為注釋的開始字符,注釋被丟棄,實際執行的sql就成如下:
UPDATE account SET credit=cred
使用mysql實現需要一個space跟隨在--,從而被識別為一個開始注釋的符號。
