mysql与标准sql外键区别_mysql8 参考手册--MySQL与标准SQL的区别

选择表差异

MySQL服务器不支持SELECT ... INTO TABLESybase SQL扩展。相反,MySQL Server支持 INSERT INTO ... SELECT标准的SQL语法,这基本上是相同的。请参见第13.2.6.1节“ INSERT ... SELECT语法”。例如:

INSERT INTO tbl_temp2 (fld_id)

SELECT tbl_temp1.fld_order_id

FROM tbl_temp1 WHERE tbl_temp1.fld_order_id > 100;

或者,您可以使用 SELECT ... INTO OUTFILE或 CREATE TABLE ... SELECT。

您可以使用SELECT ... INTO用户定义的变量。也可以使用游标和局部变量在存储的例程内部使用相同的语法。请参见第13.2.10.1节“ SELECT ... INTO语法”。

更新差异

如果访问表中要在表达式中更新UPDATE的列,请使用该列的当前值。以下语句中的第二个赋值设置col2为当前(更新)col1值,而不是原始col1值。结果是 col1和col2具有相同的值。此行为不同于标准SQL。

UPDATE t1 SET col1 = col1 + 1, col2 = col1;

外键差异

MySQL的外键实现在以下几个方面与SQL标准不同:

如果父表中有几行具有相同的引用键值, InnoDB则将执行外键检查,就好像其他具有相同键值的父行不存在一样。例如,如果您已定义 RESTRICT类型约束,并且一个子行具有多个父行, InnoDB则不允许删除任何这些父行。

InnoDB 基于索引中与外键约束对应的记录,通过深度优先算法执行级联操作。

一个FOREIGN KEY引用了非约束UNIQUE关键不是标准的SQL,而是一个 InnoDB扩展。

如果ON UPDATE CASCADE或ON UPDATE SET NULL递归更新同一级联中先前已更新过的 同一表,则其行为类似于 RESTRICT。这意味着您不能使用自引用ON UPDATE CASCADE 或ON UPDATE SET NULL操作。这是为了防止级联更新导致无限循环。自引用的ON DELETE SET NULL,在另一方面,是可能的,因为是自引用ON DELETE CASCADE。级联操作的嵌套深度不得超过15层。

在插入,删除或更新许多行的SQL语句中,将逐行检查外键约束(例如唯一约束)。在执行外键检查时,InnoDB在必须检查的子记录或父记录上设置共享的行级锁。MySQL立即检查外键约束;该检查不会推迟到事务提交。根据SQL标准,默认行为应推迟检查。也就是说,仅在处理了整个SQL语句之后才检查约束。这意味着不可能使用外键删除引用自身的行。

有关InnoDB存储引擎如何 处理外键的信息,请参见 第15.6.1.5节“ InnoDB和外键约束”。

'-'作为注释的开始

标准SQL使用C语法/this is a comment/进行注释,而MySQL Server也支持该语法。MySQL还支持对此语法的扩展,如第9.6节“注释语法”中所述,该扩展允许将特定于MySQL的SQL嵌入到注释中。

标准SQL使用“ --”作为开始注释序列。MySQL Server # 用作开始注释字符。MySQL Server还支持--注释样式的变体。也就是说,--开始注释序列后必须跟一个空格(或一个控制字符,例如换行符)。需要该空间来防止使用以下结构的自动生成的SQL查询出现问题,在该结构中我们自动为插入付款值payment:

UPDATE account SET credit=credit-payment

考虑一下如果payment值为负,会发生什么情况-1:

UPDATE account SET credit=credit--1

credit--1是SQL中的有效表达式,但 --被解释为注释的开始,部分表达式被丢弃。结果是一条语句,其含义与预期的完全不同:

UPDATE account SET credit=credit

该声明根本不会改变价值。这说明,允许以开头的注释 --会产生严重的后果。

使用我们的实现需要在后面加上一个空格, --以便在MySQL Server中将其识别为开始注释序列。因此, credit--1使用安全。

另一个安全的功能是mysql 命令行客户端忽略以开头的行 --。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值