MySQL与标准SQL的区别

news2025/1/4 18:34:53

我们试图使MySQL Server遵循ANSI SQL标准和ODBC SQL标准,但MySQL Server在某些情况下执行不同的操作:

MySQL和标准SQL特权系统之间有一些区别。例如,在MySQL中,删除表时不会自动撤销表的特权。您必须显式发出REVOKE来撤销表的特权。

CASTCAST()函数不支持强制转换为REAL或BIGINT。

SELECT INTO TABLE 语法差异

MySQL服务器不支持SELECT ... INTO TABLE Sybase数据库SQL扩展。相反,MySQL服务器支持INSERT INTO ... SELECT标准SQL语法,这基本上是一样的。例如:

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与用户定义的变量一起使用。同样的语法也可以在使用游标和局部变量的存储过程中使用。

UPDATE 语法差异

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

UPDATE t1 SET col1 = col1 + 1, col2 = col1;
外键约束差异

外键约束的MySQL实现在以下关键方面不同于SQL标准:

1、如果父表中有多行具有相同的引用键值,InnoDB会执行外键检查,就好像其他具有相同键值的父行不存在一样。例如,如果您定义了RESTRICT类型约束,并且有一个子行具有多个父行,InnoDB不允许删除任何父行。这在以下示例中显示:

mysql> CREATE TABLE parent (
    ->     id INT,
    ->     INDEX (id)
    -> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.04 sec)

mysql> CREATE TABLE child (
    ->     id INT,
    ->     parent_id INT,
    ->     INDEX par_ind (parent_id),
    ->     FOREIGN KEY (parent_id)
    ->         REFERENCES parent(id)
    ->         ON DELETE RESTRICT
    -> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.02 sec)

mysql> INSERT INTO parent (id) 
    ->     VALUES ROW(1), ROW(2), ROW(3), ROW(1);
Query OK, 4 rows affected (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> INSERT INTO child (id,parent_id) 
    ->     VALUES ROW(1,1), ROW(2,2), ROW(3,3);
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> DELETE FROM parent WHERE id=1;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key
constraint fails (`test`.`child`, CONSTRAINT `child_ibfk_1` FOREIGN KEY
(`parent_id`) REFERENCES `parent` (`id`) ON DELETE RESTRICT)

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

3、在插入、删除或更新多行的SQL语句中,逐行检查外键约束(如唯一约束)。在执行外键检查时,InnoDB会在它必须检查的子记录或父记录上设置共享行级锁。MySQL立即检查外键约束;检查不会延迟到事务提交。根据SQL标准,默认行为应该是延迟检查。即只有在处理完整个SQL语句后才检查约束。这意味着无法使用外键删除引用自身的行。

4、没有存储引擎(包括InnoDB)可以识别或强制执行referential-integrity约束定义中使用的MATCH子句。使用显式MATCH子句没有指定的效果,它会导致忽略ON DELETE和ON UPDATE子句。应避免指定MATCH。

SQL标准中的MATCH子句控制复合(多列)外键中的NULL值在与引用表中的主键进行比较时如何处理。MySQL本质上实现了MATCH SIMPLE定义的语义学,它允许外键全部或部分NULL。在这种情况下,可以插入包含此类外键的(子表)行,即使它没有拟合引用(父)表中的任何行。(可以使用触发器实现其他语义学。)

5、引用非UNIQUE键的FOREIGN KEY约束不是标准SQL而是现在已弃用的InnoDB扩展,必须通过设置restrict_fk_on_non_standard_key启用。在MySQL的未来版本中可能删除对使用非标准键的支持,不建议使用他们。

根据SQL标准,NDB存储引擎需要在作为外键引用的任何列上显式唯一键(或主键)。

6、对于不支持外键的存储引擎(如MyISAM),MySQL Server会解析并忽略外键规范。

7、MySQL解析但忽略“内联REFERENCES规范”(在SQL标准中定义),其中引用定义为列规范的一部分。MySQL仅在指定为单独的FOREIGN KEY规范的一部分时接受REFERENCES子句。定义列以使用REFERENCES tbl_name(col_name)子句没有实际效果,仅作为备忘录或注释,告诉您当前定义的列在另一个表中详情可见。使用此语法时必须注意:

a、MySQL不执行任何类型的检查来确保col_name确实存在于tbl_name中(甚至tbl_name本身存在)。

b、MySQL不会对tbl_name执行任何类型的操作,例如删除行以响应对您正在定义的表中的行执行的操作;换句话说,这种语法不会产生任何ON DELETE或ON UPDATE行为。(尽管您可以编写ON DELETE或ON UPDATE子句作为REFERENCES的一部分,但它也会被忽略。)

c、此语法创建一个列;它不创建任何类型的索引或键。

您可以将这样创建的列用作连接列,如下所示:

CREATE TABLE person (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    name CHAR(60) NOT NULL,
    PRIMARY KEY (id)
);

CREATE TABLE shirt (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    style ENUM('t-shirt', 'polo', 'dress') NOT NULL,
    color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL,
    owner SMALLINT UNSIGNED NOT NULL REFERENCES person(id),
    PRIMARY KEY (id)
);

INSERT INTO person VALUES (NULL, 'Antonio Paz');

SELECT @last := LAST_INSERT_ID();

INSERT INTO shirt VALUES
    ROW(NULL, 'polo', 'blue', @last),
    ROW(NULL, 'dress', 'white', @last),
    ROW(NULL, 't-shirt', 'blue', @last);

INSERT INTO person VALUES (NULL, 'Lilliana Angelovska');

SELECT @last := LAST_INSERT_ID();

INSERT INTO shirt VALUES
    ROW(NULL, 'dress', 'orange', @last),
    ROW(NULL, 'polo', 'red', @last),
    ROW(NULL, 'dress', 'blue', @last),
    ROW(NULL, 't-shirt', 'white', @last);

SELECT * FROM person;
+----+---------------------+
| id | name                |
+----+---------------------+
|  1 | Antonio Paz         |
|  2 | Lilliana Angelovska |
+----+---------------------+

SELECT * FROM shirt;
+----+---------+--------+-------+
| id | style   | color  | owner |
+----+---------+--------+-------+
|  1 | polo    | blue   |     1 |
|  2 | dress   | white  |     1 |
|  3 | t-shirt | blue   |     1 |
|  4 | dress   | orange |     2 |
|  5 | polo    | red    |     2 |
|  6 | dress   | blue   |     2 |
|  7 | t-shirt | white  |     2 |
+----+---------+--------+-------+

SELECT s.* FROM person p INNER JOIN shirt s
   ON s.owner = p.id
WHERE p.name LIKE 'Lilliana%'
   AND s.color <> 'white';

+----+-------+--------+-------+
| id | style | color  | owner |
+----+-------+--------+-------+
|  4 | dress | orange |     2 |
|  5 | polo  | red    |     2 |
|  6 | dress | blue   |     2 |
+----+-------+--------+-------+

以这种方式使用时,REFERENCES不会显示在SHOW CREATE TABLE或DESCRIBE的输出中:

mysql> SHOW CREATE TABLE shirt\G
*************************** 1. row ***************************
Table: shirt
Create Table: CREATE TABLE `shirt` (
`id` smallint(5) unsigned NOT NULL auto_increment,
`style` enum('t-shirt','polo','dress') NOT NULL,
`color` enum('red','blue','orange','white','black') NOT NULL,
`owner` smallint(5) unsigned NOT NULL,
PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
'--'作为SQL注解的开头

标准SQL使用C语法/* this is a comment */用于注释,MySQL服务器也支持这种语法。MySQL还支持对这种语法的扩展,使MySQL特定的SQL能够嵌入到注释中。

MySQL服务器也使用#作为开始注释字符。这是不标准的。

标准SQL还使用"--"作为开始注释序列。MySQL服务器支持--注释样式的变体;--开始注释序列被接受,但必须后跟空格或换行符等空格字符。该空格旨在防止使用如下结构生成的SQL查询出现问题,这些结构会更新余额以反映费用:

UPDATE account SET balance=balance-charge
WHERE account_id=user_id

考虑一下当charge具有负值时会发生什么,例如-1,这可能是将金额记入账户的情况。在这种情况下,生成的语句如下所示:

UPDATE account SET balance=balance--1
WHERE account_id=5752;

balance--1是有效的标准SQL,但是--被解释为注释的开始,并且表达式的一部分被丢弃。结果是一个与预期含义完全不同的语句:

UPDATE account SET balance=balance
WHERE account_id=5752;

该语句的值根本不会发生任何变化。为了防止这种情况发生,MySQL需要在--后面加上一个空格字符,以便在MySQL服务器中将其识别为开始注释序列,以便始终可以安全使用balance--1之类的表达式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2269447.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GitHub Fork 和 Clone 的深度指南:操作解析与 Pull Request 完整流程20241231

GitHub Fork 和 Clone 的深度指南&#xff1a;操作解析与 Pull Request 完整流程 快速导航 引言Fork 与 Clone 概念对比完整开发流程Pull Request 最佳实践常见问题与解决方案最佳实践建议实战案例 引言 在开发者的协作世界中&#xff0c;GitHub 就像一座桥梁&#xff0c;连…

典型常见的基于知识蒸馏的目标检测方法总结二

来源&#xff1a;https://github.com/LutingWang/awesome-knowledge-distillation-for-object-detection收录的方法 NeurIPS 2017&#xff1a;Learning Efficient Object Detection Models with Knowledge Distillation CVPR 2017&#xff1a;Mimicking Very Efficient Networ…

【分布式数据库与数据存储方案】详解

分布式数据库与数据存储方案 一、分布式数据库概述 &#xff08;一&#xff09;概念 分布式数据库是一种将数据分散存储在多个物理节点上的数据库系统&#xff0c;这些节点通过网络进行连接和通信&#xff0c;对外呈现出一个统一的逻辑数据库&#xff0c;用户或应用程序可以像…

【分布式文件存储系统Minio】2024.12保姆级教程

文章目录 1.介绍1.分布式文件系统2.基本概念 2.环境搭建1.访问网址2.账号密码都是minioadmin3.创建一个桶4.**Docker安装miniomc突破7天限制**1.拉取镜像2.运行容器3.进行配置1.格式2.具体配置 4.查看桶5.给桶开放权限 3.搭建minio模块1.创建一个oss模块1.在sun-common下创建2.…

产品经理2025年展望

产品经理作为连接技术、设计与市场需求的桥梁&#xff0c;在快速变化的商业环境中扮演着至关重要的角色。展望2025年&#xff0c;随着技术的不断进步和消费者需求的日益多样化&#xff0c;产品经理的工作将面临更多挑战与机遇。 一、人工智能与自动化深化应用&#xff1a; 到…

风力涡轮机缺陷检测数据集,91.4%准确识别率,18912张图片,支持yolo,PASICAL VOC XML,COCO JSON格式的标注

风力涡轮机缺陷检测数据集&#xff0c;91.4&#xff05;准确识别率&#xff0c;18912张图片&#xff0c;支持yolo&#xff0c;PASICAL VOC XML&#xff0c;COCO JSON格式的标注 数据集下载&#xff1a; &#xff59;&#xff4f;&#xff4c;&#xff4f; &#xff56;&#…

五、Vue 循环语句

文章目录 简介一、基础数组迭代二、对象属性迭代三、整数循环 简介 在 Vue.js 的世界里&#xff0c;当我们需要处理重复性的结构并依据数据动态渲染时&#xff0c;v-for 指令就成了不可或缺的工具&#xff0c;它赋予开发者简洁且强大的能力&#xff0c;轻松应对各种列表渲染场景…

用css实现瀑布流布局

上效果 知识理解 column-count: 4; column-gap: 15px;实现固定四行瀑布流布局 columns: 200px auto;column-gap: 15px;由浏览器根据容器的宽度自动调整&#xff0c;尽可能一行多个200px宽度的列数 <!DOCTYPE html> <html lang"en"><head><me…

275-增强型多功能数据采集卡PCIe-6251-EX

产品特点&#xff1a; 高速高精度数据采集&#xff0c;16bit10MSPS&#xff0c;32路单端/16路差分高速高精度任意波形发生&#xff0c;14bit165MHz&#xff0c;2路完全独立完全可编程的I/O端口&#xff0c;33个完全可编程的量程选择&#xff0c;0~5V/0~10V/5V/10VPCIe通信接口…

如何将联系人从Android转移到 OPPO? [解决了]

概括 OPPO Reno4系列预计将于2020年10月1日上午9点30分举行线上发布会。从其官方预告片中我们不难发现&#xff0c;OPPO Reno4旗舰手机试图诠释梦想、挑战、勇气、自信和可能性。 3D曲面屏&#xff0c;图形流畅&#xff0c;机身更轻薄&#xff0c;色彩真实。听起来棒极了&…

uniapp 微信小程序开发使用高德地图、腾讯地图

一、高德地图 1.注册高德地图开放平台账号 &#xff08;1&#xff09;创建应用 这个key 第3步骤&#xff0c;配置到项目中locationGps.js 2.下载高德地图微信小程序插件 &#xff08;1&#xff09;下载地址 高德地图API | 微信小程序插件 &#xff08;2&#xff09;引入项目…

Rabbitmq追问2

分析rabbitmq 默认使用姿势是什么 direct fanout还是什么 public void convertAndSend(String exchange, String routingKey, Object object, CorrelationData correlationData) throws AmqpException { this.send(exchange, routingKey, this.convertMessageIfNecessary(obje…

工作中常用Vim的命令

Hi, 我是你们的老朋友&#xff0c;主要专注于嵌入式软件开发&#xff0c;有兴趣不要忘记点击关注【码思途远】 目录 0. ctags -R 1.认识 Vim的几种工作模式 2.高频使用命令 2.1 修改文件 2.2 关于行号 2.3 删除多行&#xff0c;删除部分 2.4 复制粘贴 2.5 光标移动 2.…

【ComfyUI + 自定义节点】图片叠加掩膜(mask)部分扣掉(变黑)

Comfyui的官方示例&#xff1a;https://github.com/comfyanonymous/ComfyUI/blob/master/custom_nodes/example_node.py.example 一、代码 &#xff08; 逻辑&#xff1a;将图片对应掩膜覆盖的区域替换为黑色&#xff09; 因为comfyui加载的图片后&#xff0c;转化为tensor i…

RocketMQ学习笔记(持续更新中......)

目录 1. 单机搭建 2. 测试RocketMQ 3. 集群搭建 4. 集群启动 5. RocketMQ-DashBoard搭建 6. 不同类型消息发送 1.同步消息 2. 异步消息发送 3. 单向发送消息 7. 消费消息 1. 单机搭建 1. 先从rocketmq官网下载二进制包&#xff0c;ftp上传至linux服务器&#xff0c…

【二】arcgis JavaScript api 实现加载不同坐标系的底图和三维服务

提示&#xff1a;如果是天地图底图参考这篇文章 【一】arcgis JavaScript api 实现加载不同坐标系的底图和三维服务_arcgis js api 调用三维地图服务-CSDN博客 需求&#xff1a; 前端开发实现底图&#xff08;wkid&#xff1a;3857&#xff0c;web墨卡托&#xff09;&#x…

PDF怎么压缩得又小又清晰?5种PDF压缩方法

PDF 文件在日常办公与学习中使用极为频繁&#xff0c;可想要把它压缩得又小又清晰却困难重重。一方面&#xff0c;PDF 格式本身具有高度兼容性&#xff0c;集成了文字、图像、矢量图等多样元素&#xff0c;压缩时难以兼顾不同元素特性&#xff0c;稍不注意&#xff0c;文字就会…

数据结构与算法之动态规划: LeetCode 62. 不同路径 (Ts版)

不同路径 https://leetcode.cn/problems/unique-paths/description/ 描述 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “…

Edge如何获得纯净的启动界面

启动Edge会出现快速链接&#xff0c;推广链接&#xff0c;网站导航&#xff0c;显示小组件&#xff0c;显示信息提要&#xff0c;背景 ●复杂页面 ●精简页面 点击页面设置按钮 关闭快速链接 关闭网站导航 关闭小组件 关闭信息提要 关闭背景 关闭天气提示 精简页面看起来十分舒…

如何利用java爬虫获得AMAZON商品详情

在数字化时代&#xff0c;数据的价值不言而喻&#xff0c;尤其是对于电商平台而言&#xff0c;获取商品的详细信息对于优化用户体验、制定营销策略至关重要。亚马逊作为全球最大的电商平台之一&#xff0c;拥有海量的商品信息。本文将介绍如何使用Java编写爬虫程序&#xff0c;…