mysql与sql-92兼容吗?

Nov*_*tor 6 mysql sql database

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

create table client(
    rc character varying(11)
    constraint client_pk primary key 
);
Run Code Online (Sandbox Code Playgroud)

但是,mysql不支持以这种方式设置主键.(我99%肯定它符合sql-92标准)所以我的问题:MySQL是否因为20年前的标准甚至没有支持这些基本的东西,或者我错过了什么?

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

spe*_*593 6

要回答你的问题,不,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的行为与接受相同语法的其他数据库有很大不同.

作为另一个示例,MySQL相对于FOREIGN KEY约束的行为显着不同,这取决于表的存储引擎是MyISAM还是InnoDB.


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

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

create table client(
   rc character varying(11) primary key 
);
Run Code Online (Sandbox Code Playgroud)

或单独声明表约束"

create table client(
   rc character varying(11),
   primary key (rc)
);
Run Code Online (Sandbox Code Playgroud)

这两种形式都与SQL-92规范完全兼容.

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

create table client(
   rc character varying(11),
   constraint client_pk primary key (rc)
);
Run Code Online (Sandbox Code Playgroud)

并且该语法也完全兼容SQL-92特定.

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

请注意,MySQL接受的语法,以及在某些情况下它执行的操作,取决于特定MySQL变量的设置,特别sql_mode是,在您的语句,default-storage-engine变量的设置和特别关注的情况下,是使用MyISAM引擎还是InnoDB引擎创建此表,甚至是默认存储引擎设置为的角点BLACKHOLE.

我知道您的目标是"使用标准化语法创建此表".

但我觉得你真的不要需要MySQL的特定语法的至少一些最小子集而言,在尽可能的品种当"标准化语法"提出的是,MySQL可以表现出可能行为.考虑:

SET default-storage-engine = 'MyISAM' ;
SET default-storage-engine = 'InnoDB' ;
SET sql_mode = '' ; 
SET sql_mode = 'ANSI' ; 
Run Code Online (Sandbox Code Playgroud)