いいえ、MySQL は SQL-92 仕様に完全には準拠していません。MySQL は仕様のサブセットのみをサポートしており、MySQL には SQL-92 仕様の一部ではないいくつかの重要な (非常に有用な) 拡張機能があります。 .
これは、MySQL が受け入れて認識する SQL 構文だけではなく、(おそらくより大きな問題) MySQL がその構文で実際に行うこと、MySQL が受け入れる構文で実行する実際の操作に関するものです。これは、MySQL が認識する構文の表面的な問題よりも重要な問題です。
MySQL が怠けているわけではありません。そして、MySQL が気にしないというわけではありません。
MySQL ドキュメントには、SQL 標準との MySQL の相違点に特化したセクション全体があります。そして、最も重要な違いは実際には構文に関するものではなく、「MySQL は場合によって操作を異なる方法で実行する」という事実に関するものです。
たとえば、MySQL は CHECK 制約の構文を受け入れますが、MySQL は実際にチェックを行ったり、CHECK 制約を適用しようとしたりしません。MySQL は SQL-92 仕様を満たす構文を受け入れますが、MySQL の動作は、同じ構文を受け入れる他のデータベースとは大きく異なります。
別の例として、FOREIGN KEY 制約に関する MySQL の動作は、テーブルのストレージ エンジンが MyISAM か InnoDB かによって大きく異なります。
CREATE TABLE ステートメントを MySQL で実行するには、それを変更する必要があります。
constraint client_pk
SQLテキストから削除するのが最も簡単なオプションのようです。列定義でテーブル制約を指定できます。
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' ;