MySQL/MySQL與SQL92的區別
外觀
< MySQL
MySQL8與標準SQL的區別
[編輯]- REVOKE: MySql刪除表時不會自動撤銷表的特權。必須顯式發出一條 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 的不同
- 一個外鍵在主表中可以是非唯一的鍵值。
- 如果從表引用主表的值,該值在主表中有多行,那麼這些行是都不能刪除的。
- ON UPDATE CASCADE 或 ON UPDATE SET NULL是不能自引用的,但是 ON DELETE SET NULL可以, ON DELETE CASCADE或許可以,但是嵌套是不能超過15
- 在一個增刪改多行的語句,外鍵約束,比如唯一約束,是一行一行的被檢查。外鍵約束檢查功能的時候,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=credit
使用mysql實現需要一個space跟隨在-,從而被識別為一個開始注釋的符號。