前几天我试图在mysql中创建一个使用标准语法的表:
create table client(
rc character varying(11)
constraint client_pk primary key
);
但是,mysql不支持以这种方式设置主键。 (我99%肯定它符合sql-92规范) 所以我的问题是:MySQL是否因为20年前的标准而无法支持这些基本的东西,或者我错过了什么?
编辑:我的目标不是使用一些mysql方言创建这个表,而是使用标准化语法创建这个表。问题是它是否可能。
答案 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
。
参考文献:
答案 2 :(得分:1)
create table tablename
(
column_Name varchar(20) not null,
column_Name varchar(20),
primary key(column_name)
);
通过这种方式,您可以创建表格并设置主键。