mysql与sql-92兼容吗?

时间:2013-02-15 13:41:10

标签: mysql sql database

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

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

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

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

3 个答案:

答案 0 :(得分: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中执行,您需要更改它。

看起来最简单的选择是从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引擎创建此表,甚至是默认存储引擎设置的极端情况到BLACKHOLE

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

但我认为你真的 DO 需要至少关注MySQL特定语法的一些最小子集,就MySQL和#34所呈现的各种可能行为而言;标准化语法"。考虑:

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

答案 1 :(得分:2)

这适用于MySQL 5.5.29:

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

但是,正如a_horse_with_no_name指出的那样,MySQL会忽略client_pk名称并将其称为PRIMARY

参考文献:

http://savage.net.au/SQL/sql-92.bnf.html

http://owen.sj.ca.us/~rk/howto/sql92.html

答案 2 :(得分:1)

create table tablename
(
    column_Name varchar(20) not null,
    column_Name varchar(20),
    primary key(column_name)
);

通过这种方式,您可以创建表格并设置主键。