Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql与sql-92兼容吗?_Mysql_Sql_Database - Fatal编程技术网

mysql与sql-92兼容吗?

mysql与sql-92兼容吗?,mysql,sql,database,Mysql,Sql,Database,前几天,我试图用mysql创建一个表,使用标准语法: create table client( rc character varying(11) constraint client_pk primary key ); 但是,mysql不支持这样设置主键。(我99%确信它符合sql-92规范) 所以我的问题是:MySQL甚至不能支持20年前的标准中的这些基本东西,还是我遗漏了什么 编辑:我的目标不是使用一些mysql方言创建这个表,而是使用标准化语法创建这个表。问题是这是否可能

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

create table client(
    rc character varying(11)
    constraint client_pk primary key 
);
但是,mysql不支持这样设置主键。(我99%确信它符合sql-92规范) 所以我的问题是:MySQL甚至不能支持20年前的标准中的这些基本东西,还是我遗漏了什么

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

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

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

这在MySQL 5.5.29中适用:

create table client(
    rc character varying(11),
    constraint client_pk primary key(rc)
);
然而,正如一个没有名字的马所指出的那样,MySQL忽略了
客户机pk
名称,并将其称为

参考资料:


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

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

这并不是说MySQL是懒惰的。这并不是说MySQL不在乎

MySQL文档中有整整一节专门讨论MySQL与SQL标准的区别。最重要的区别不是语法,而是“MySQL在某些情况下执行的操作不同”

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

另一个例子是,MySQL在外键约束方面的行为有很大不同,这取决于表的存储引擎是MyISAM还是InnoDB


要在MySQL中执行CREATETABLE语句,需要对其进行更改

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

create table client(
   rc character varying(11) primary key 
);
或单独声明表约束“

这两种形式都与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\u模式
,对于您的语句,需要特别关注的是
默认存储引擎
变量的设置,以及是否将在使用
MyISAM
引擎或
InnoDB
引擎,甚至是默认存储引擎已设置为
BLACKHOLE
的情况

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

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

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

我不同意:)当然你必须指定你设置主键的字段,但是因为我没有在rc字段后写逗号,约束应该自动应用到这个字段啊,对不起。我没有注意到。MySQL不支持这个(即使它支持:你也不能指定主键约束的名称)MySQL只识别SQL-92标准语法的一个子集;在它所接受的子集中,某些语法可能导致不符合SQL-92规范的行为。因此,MySQL在某种程度上是兼容的,但在几个关键领域也是不兼容的。本文档的整个部分专门讨论这些关键问题。”差异”,这取决于MySQL的版本。对于MySQL 5.5,请参阅:您不需要列
客户机\u pk
。这应该是约束的名称。语法符合SQL-92,这是一个列级约束:啊。感谢您指出@a_horse\u没有\u名称。我经常使用不同的数据库(DB2和MySQL)所以我一直致力于使用有效的SQL-92语法对任何一个数据库执行SQL。但是我们从来没有使用像这样的“原始”SQL语句在任何一个系统上创建表,它们总是以其他方式创建的,所以我只是不熟悉创建语法。这很有趣。所以MySQL接受什么和支持什么有很大区别一个问题:为什么MySQL不支持这些非常重要的完整性参数(如您提到的检查,或级联删除…)?我的意思是,这是一个相当大的缺陷(将来可能会出现),或者是一些(奇怪的)特性kind?@Novellizator:这些差异不是MySQL实现中的缺陷或缺陷;相反,这些差异是MySQL满足其指定设计目标的结果。MySQL的旧版本不接受某些“标准”语法,这给试图“导入”从其他DBMS导出的定义的用户带来了困难(例如Oracle。)我认为
SET default-storage-engine = 'MyISAM' ;
SET default-storage-engine = 'InnoDB' ;
SET sql_mode = '' ; 
SET sql_mode = 'ANSI' ;