草庐IT

mysql - mysql 与 sql-92 兼容吗?

coder 2023-10-03 原文

前几天我尝试使用标准语法在 mysql 中创建一个表:

create table client(
    rc character varying(11)
    constraint client_pk primary key 
);

但是mysql不支持这样设置主键。 (我 99% 确定它符合 sql-92 规范) 所以我的问题是:MySQL 是否无法支持 20 年前的标准中的这些基本内容,还是我遗漏了什么?

编辑:我的目标不是使用某些 mysql 方言创建此表,而是使用标准化语法创建此表。问题是这是否可能。

最佳答案

要回答你的问题,不,MySQL 不完全符合 SQL-92 规范,因为 MySQL 只支持该规范的一个子集,并且 MySQL 有一些重要的(非常有用的)扩展,这些扩展不是 SQL 的一部分-92规范。

这不仅仅是关于 MySQL 接受和识别的 SQL 语法,而且(可能更大的问题)是关于 MySQL 实际上用语法做什么,MySQL 用语法执行的实际操作它确实接受。与 MySQL 识别的语法这一更肤浅的问题相比,这确实是一个更重要的问题。

并不是说 MySQL 懒惰。并不是说 MySQL 不关心。

MySQL 文档中有一整节专门讨论 MySQL 与 SQL 标准的差异。最重要的区别并不是真正的语法,而是“MySQL 在某些情况下以不同方式执行操作”这一事实。

例如,MySQL 接受 CHECK 约束的语法,但 MySQL 实际上并不进行任何检查或尝试强制执行 CHECK 约束。 MySQL 接受符合 SQL-92 规范的语法,但 MySQL 的行为与接受相同语法的其他数据库有很大不同。

再举一个例子,根据表的存储引擎是 MyISAM 还是 InnoDB,MySQL 在 FOREIGN KEY 约束方面的行为有很大不同。


要让您的 CREATE TABLE 语句在 MySQL 中执行,您需要更改它。

看起来最简单的选择是从 sql 文本中删除 constraint client_pk。您可以在列定义中指定表约束:

create table client(
   rc character varying(11) primary key 
);

或者单独声明表约束"

create table client(
   rc character varying(11),
   primary key (rc)
);

这两种形式都完全符合 SQL-92 规范。

请注意,当约束声明不在列上时,MySQL 确实接受约束名称定义的语法,例如

create table client(
   rc character varying(11),
   constraint client_pk primary key (rc)
);

而且该语法也完全兼容 SQL-92 规范。

但请注意,MySQL 忽略 提供的约束名称,并将名称PRIMARY 分配给主键约束。即使约束是在单独的 ALTER TABLE 语句中声明的,也是如此。

请注意,MySQL 接受的语法,以及在某些情况下它执行的操作,取决于特定 MySQL 变量的设置,特别是 sql_mode,并且需要特别关注,在这种情况下你的声明,default-storage-engine 变量的设置,以及这个表是使用 MyISAM 引擎还是 InnoDB 创建的引擎,甚至 default-storage-engine 已设置为 BLACKHOLE 的极端情况。

我了解到您的目标是“使用标准化语法创建此表”。

但我认为您确实确实至少需要关注 MySQL 特定语法的最小子集,就 MySQL 在使用“标准化语法”时可能表现出的各种可能行为而言”。考虑:

SET default-storage-engine = 'MyISAM' ;
SET default-storage-engine = 'InnoDB' ;
SET sql_mode = '' ; 
SET sql_mode = 'ANSI' ; 

关于mysql - mysql 与 sql-92 兼容吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14896045/

有关mysql - mysql 与 sql-92 兼容吗?的更多相关文章

  1. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  2. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  3. Hive SQL 五大经典面试题 - 2

    目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类

  4. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  5. ruby-on-rails - 无法安装 mysql2 0.3.14 gem - 2

    我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby​​目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin

  6. ruby - 如何使用 ruby​​ mysql2 执行事务 - 2

    我已经开始使用mysql2gem。我试图弄清楚一些基本的事情——其中之一是如何明确地执行事务(对于批处理操作,比如多个INSERT/UPDATE查询)。在旧的ruby-mysql中,这是我的方法:client=Mysql.real_connect(...)inserts=["INSERTINTO...","UPDATE..WHEREid=..",#etc]client.autocommit(false)inserts.eachdo|ins|beginclient.query(ins)rescue#handleerrorsorabortentirelyendendclient.commi

  7. ruby-on-rails - 不兼容的库版本 : nokogiri. bundle 需要 8.0.0 或更高版本,但 libiconv.2.dylib 提供 7.0.0 版本 - 2

    为了在我的mac上为一个rails项目安装mysql,我遵循了安装Homebrew软件和删除mac端口的在线建议。这是问题开始的地方。rails项目不会构建,我得到这个:[rake--prereqs]rakeaborted!dlopen(/Users/Parker/.rvm/gems/ruby-1.9.3-p448/gems/nokogiri-1.6.0/lib/nokogiri/nokogiri.bundle,9):Librarynotloaded:/opt/local/lib/libiconv.2.dylibReferencedfrom:/Users/Parker/.rvm/gem

  8. sql - 在 Rails Console for PostgreSQL 的表中显示数据 - 2

    我找到了这样的东西:Rails:Howtolistdatabasetables/objectsusingtheRailsconsole?这一行没问题:ActiveRecord::Base.connection.tables并返回所有表但是ActiveRecord::Base.connection.table_structure("users")产生错误:ActiveRecord::Base.connection.table_structure("projects")我认为table_structure不是Postgres方法。如何列出Postgres数据库的Rails控制台中表中的所有

  9. ruby - 防止SQL注入(inject)/好的Ruby方法 - 2

    Ruby中防止SQL注入(inject)的好方法是什么? 最佳答案 直接使用ruby?使用准备好的语句:require'mysql'db=Mysql.new('localhost','user','password','database')statement=db.prepare"SELECT*FROMtableWHEREfield=?"statement.execute'value'statement.fetchstatement.close 关于ruby-防止SQL注入(inject

  10. ruby-on-rails - 如何在 Rails 中的不同数据库上执行直接 SQL 代码 - 2

    我正在编写一个Rails应用程序,它将监视某些特定数据库的数据质量。为了做到这一点,我需要能够对这些数据库执行直接SQL查询——这当然与用于驱动Rails应用程序模型的数据库不同。简而言之,这意味着我无法使用通过ActiveRecord基础连接的技巧。我需要连接的数据库在设计时是未知的(即:我不能将它们的详细信息放在database.yaml中)。相反,我有一个模型“database_details”,用户将使用它来输入应用程序将在运行时执行查询的数据库的详细信息。因此与这些数据库的连接实际上是动态的,细节仅在运行时解析。 最佳答案

随机推荐