前几天我试图使用标准语法在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
);
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引擎创建此表,甚至是当default-storage-engine设置为BLACKHOLE的特殊情况。
我了解您的目标是“使用标准化语法创建此表”。
但我认为您确实需要关注MySQL特定语法的至少一些最小子集,因为MySQL在面对“标准化语法”时可能会展现出多种可能的行为。考虑以下内容:
SET default-storage-engine = 'MyISAM' ;
SET default-storage-engine = 'InnoDB' ;
SET sql_mode = '' ;
SET sql_mode = 'ANSI' ;
create table client(
rc character varying(11),
constraint client_pk primary key(rc)
);
client_pk
的名称,将其称为 PRIMARY
。client_pk
的列。这应该是约束的名称。语法是符合SQL-92标准的,它是一个列级约束:http://savage.net.au/SQL/sql-92.bnf.html#column%20definition - user330315create table tablename
(
column_Name varchar(20) not null,
column_Name varchar(20),
primary key(column_name)
);