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方言创建此表,而是使用标准化语法创建此表.问题是这是否可能.
要回答你的问题,不,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)
归档时间: |
|
查看次数: |
3322 次 |
最近记录: |