MySQL/MySQL與SQL92的區別

維基教科書,自由的教學讀本

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跟隨在-,從而被識別為一個開始註釋的符號。