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跟随在-,从而被识别为一个开始注释的符号。