当前位置: 首页 > news >正文

MySQL与标准SQL的区别

我们试图使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_idFROM 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: 0mysql> 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: 0mysql> 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 VALUESROW(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 VALUESROW(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 sON 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之类的表达式。

相关文章:

MySQL与标准SQL的区别

我们试图使MySQL Server遵循ANSI SQL标准和ODBC SQL标准&#xff0c;但MySQL Server在某些情况下执行不同的操作&#xff1a; MySQL和标准SQL特权系统之间有一些区别。例如&#xff0c;在MySQL中&#xff0c;删除表时不会自动撤销表的特权。您必须显式发出REVOKE来撤销表的特权…...

docker中使用Dockerfile设置Volume挂载点

关于在docker中如何使用Volume&#xff0c;可以参考文章&#xff1a; docker中使用Volume完成数据共享-CSDN博客 如果想在生成docker镜像的时候设置好挂载点&#xff0c;而不是在运行镜像生成容器时生成。 下面以自建一个tomcat镜像为例&#xff0c;演示如何在生成镜像时设置…...

Samsung手机首次主要采用竞对Micron LPDDR5内存

根据韩国媒体《韩国先驱报》&#xff08;The Korea Herald&#xff09;的报道&#xff0c;即将在1月底发布的三星 Galaxy S25 系列智能手机将首次主要使用美光科技&#xff08;Micron Technology&#xff09;提供的移动DRAM&#xff0c;而非三星自家的产品。这一消息对于三星的…...

【项目开发】C#环境配置及VScode运行C#教程(学生管理系统)

原创文章,禁止转载。 文章目录 下载.NETVScode配置运行程序下载.NET 官网链接: https://dotnet.microsoft.com/en-us/download选择任意版本下载: 下载完成后,双击运行exe文件,等待安装完成。 在控制台输入: dotnet --version若出现版本信息,说明安装成功: VScode配…...

[241231] CachyOS 2024 年终总结:性能飞跃与社区繁荣 | ScyllaDB 宣布转向开源可用许可证

目录 CachyOS 2024 年终总结&#xff1a;性能飞跃与社区繁荣ScyllaDB 宣布转向开源可用许可证 CachyOS 2024 年终总结&#xff1a;性能飞跃与社区繁荣 CachyOS 2024 年的最后一个版本 (也是第 13 个版本) 已经发布&#xff0c;同时也迎来了辞旧迎新之际。让我们一起回顾 Cachy…...

AI-Talk开发板之超拟人

一、说明 运行duomotai_ap sdk下的LLM_chat例程&#xff0c;实现开发板和超拟人大模型进行语音交互&#xff0c;支持单轮和多轮交互。 二、SDK更新 v2.3.0及以上的SDK版本才支持超拟人&#xff0c;如果当前SDK在v2.3.o以下&#xff0c;需要更新SDK。在SDK目录(duomotai_ap)下…...

Swift Concurrency(并发)学习

Swift 的并发模型是基于 异步任务 和 任务调度 的一套现代化的异步编程工具。以下是相关语法规则总结 1. 异步函数&#xff08;async&#xff09;与 await async 用于声明一个异步函数&#xff0c;表示函数可能会执行耗时任务&#xff0c;例如网络请求、文件读写等。在调用异步…...

从0开始的opencv之旅(1)cv::Mat的使用

目录 Mat 存储方法 创建一个指定像素方式的图像。 尽管我们完全可以把cv::Mat当作一个黑盒&#xff0c;但是笔者的建议是仍然要深入理解和学习cv::Mat自身的构造逻辑和存储原理&#xff0c;这样在查找问题&#xff0c;或者是遇到一些奇奇怪怪的图像显示问题的时候能够快速的想…...

Hoverfly 任意文件读取漏洞(CVE-2024-45388)

漏洞简介 Hoverfly 是一个为开发人员和测试人员提供的轻量级服务虚拟化/API模拟/API模拟工具。其 /api/v2/simulation​ 的 POST 处理程序允许用户从用户指定的文件内容中创建新的模拟视图。然而&#xff0c;这一功能可能被攻击者利用来读取 Hoverfly 服务器上的任意文件。尽管…...

详解网络管理

网络管理是指对计算机网络资源、设备和服务的有效配置、监控、管理和优化的过程。它的目的是确保网络的高效、可靠和安全运行。网络管理的关键任务包括网络监控、配置管理、性能管理、安全管理、故障管理和计费管理。下面是详细的讲解&#xff1a; 1. 网络管理的目标 高可用性…...

iOS 11 中的 HEIF 图像格式 - 您需要了解的内容

HEIF&#xff0c;也称为高效图像格式&#xff0c;是iOS 11 之后发布的新图像格式&#xff0c;以能够在不压缩图像质量的情况下以较小尺寸保存照片而闻名。换句话说&#xff0c;HEIF 图像格式可以具有相同或更好的照片质量&#xff0c;同时比 JPEG、PNG、GIF、TIFF 占用更少的设…...

深入AIGC领域:ChatGPT开发者获取OpenAI API Key的实用指南

在AIGC&#xff08;人工智能生成内容&#xff09;领域&#xff0c;ChatGPT作为一种强大的自然语言处理工具&#xff0c;正逐渐成为开发者们不可或缺的助手。然而&#xff0c;要充分发挥ChatGPT的潜力&#xff0c;首先需要获取OpenAI的API Key。本文将详细介绍如何获取OpenAI AP…...

软件工程实验-实验2 结构化分析与设计-总体设计和数据库设计

一、实验内容 1. 绘制工资支付系统的功能结构图和数据库 在系统设计阶段&#xff0c;要设计软件体系结构&#xff0c;即是确定软件系统中每个程序是由哪些模块组成的&#xff0c;以及这些模块相互间的关系。同时把模块组织成良好的层次系统&#xff1a;顶层模块通过调用它的下层…...

密码学精简版

密码学是数学上的一个分支&#xff0c;同时也是计算机安全方向上很重要的基础原理&#xff0c;设置密码的目的是保证信息的机密性、完整性和不可抵赖性&#xff0c;安全方向上另外的功能——可用性则无法保证&#xff0c;可用性有两种方案保证&#xff0c;冗余和备份&#xff0…...

开源模型迎来颠覆性突破:DeepSeek-V3与Qwen2.5如何重塑AI格局?

不用再纠结选择哪个AI模型了&#xff01;chatTools 一站式提供o1推理模型、GPT4o、Claude和Gemini等多种选择&#xff0c;快来体验吧&#xff01; 在全球人工智能模型快速发展的浪潮中&#xff0c;开源模型正逐渐成为一股不可忽视的力量。近日&#xff0c;DeepSeek-V3和Qwen 2.…...

【51单片机零基础-chapter4:LED数码管】

LED数码管本质是一种廉价的显示器,由多个发光二极管封装组成的8字形器件 如果要显示6,那么需要点亮除了B以外的所有段,并且开发板上默认是共阴极 阳极A->G除了B全点亮,所以7,4,2,1,9,10全接正极:10111110 这个就是段码,表示显示的数据 静态LED显示 开发板上是四个一体…...

【网络】什么是路由协议(Routing Protocols)?常见的路由协议包括RIP、OSPF、EIGRP和BGP

路由协议(Routing Protocols) 像 google map RIP &#xff08;Routing Information Protocol&#xff09;:跳数 超了就废了 OSPF&#xff08;Open Shortest Path First&#xff09; 就好像拿着map找最短距离(跳数) EIGRP&#xff08;Enhanced Interior Gateway Routing Protoco…...

Unity3D ILRuntime开发原则与接口绑定详解

引言 ILRuntime是一款基于C#的热更新框架&#xff0c;使用IL2CPP技术将C#代码转换成C代码&#xff0c;支持动态编译和执行代码&#xff0c;适用于Unity3D的所有平台&#xff0c;包括Android、iOS、Windows、Mac等。本文将详细介绍ILRuntime在Unity3D中的开发原则及接口绑定技术…...

闻泰科技涨停-操盘训练营实战-选股和操作技术解密

如上图&#xff0c;闻泰科技&#xff0c;今日涨停&#xff0c;这是前两天分享布局的一个潜伏短线的标的。 选股思路&#xff1a; 1.主图指标三条智能辅助线粘合聚拢&#xff0c;即将选择方向 2.上图红色框住部分&#xff0c;在三线聚拢位置&#xff0c;震荡筑底&#xff0c;…...

我用AI学Android Jetpack Compose之开篇

最近突发奇想&#xff0c;想学一下Jetpack Compose&#xff0c;打算用Ai学&#xff0c;学最新的技术应该要到官网学&#xff0c;不过Compose已经出来一段时间了&#xff0c;Ai肯定学过了&#xff0c;用Ai来学&#xff0c;应该问题不大&#xff0c;学习过程记录下来&#xff0c;…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…...

SQL Server 触发器调用存储过程实现发送 HTTP 请求

文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...