6

先日、私はmysqlで標準構文を使用してテーブルを作成しようとしていました:

create table client(
    rc character varying(11)
    constraint client_pk primary key 
);

ただし、mysqlはこの方法での主キーの設定をサポートしていません。(私はそれがsql-92標準に準拠していると99%確信しています)それで私の質問:MySQLは20年前の標準からのこれらの基本的なものでさえサポートできませんか、それとも私は何かを逃していますか?

編集:私の目標は、いくつかのmysql方言を使用してこのテーブルを作成することではなく、標準化された構文を使用してこのテーブルを作成することです。そして問題はそれが可能かどうかです。

4

3 に答える 3

6

いいえ、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_pkSQLテキストから削除するのが最も簡単なオプションのようです。列定義でテーブル制約を指定できます。

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_modedefault-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' ; 
于 2013-02-15T16:28:08.413 に答える
2

これはMySQL5.5.29で機能します。

create table client(
    rc character varying(11),
    constraint client_pk primary key(rc)
);

ただし、a_horse_with_no_nameが指摘しているように、MySQLはそのclient_pk名前を無視して呼び出しますPRIMARY

参照:

http://savage.net.au/SQL/sql-92.bnf.html

http://owen.sj.ca.us/~rk/howto/sql92.html

于 2013-02-15T13:54:59.957 に答える
1
create table tablename
(
    column_Name varchar(20) not null,
    column_Name varchar(20),
    primary key(column_name)
);

このようにして、テーブルを作成し、主キーを設定できます。

于 2013-02-15T13:48:03.960 に答える