2012-06-06 21 views
56

は誰でもPRIMARY KEYUNIQUE KEYKEYの目的について説明でき、テーブルを作成するときに一緒に使用MySQL?MySQLの - 「PRIMARY KEY」、「UNIQUE KEY」と「KEY」の意味、彼らは単一<code>CREATE TABLE</code>文で一緒にそれを置く場合

CREATE TABLE IF NOT EXISTS `tmp` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `uid` varchar(255) NOT NULL, 
    `name` varchar(255) NOT NULL, 
    `tag` int(1) NOT NULL DEFAULT '0', 
    `description` varchar(255), 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `uid` (`uid`), 
    KEY `name` (`name`), 
    KEY `tag` (`tag`) 
) ENGINE=InnoDB AUTO_INCREMENT=1 ; 

このクエリをMySQLに変換するにはどうすればよいですか?

+3

:[?MySQLのKEYキーワード](http://stackoverflow.com/q/924265/697449)基本的に 'KEY'がINDEX''と同義です。 –

答えて

80

キーは普通の指標であるを参照してくださいMSSQLするためのmysqlを変換するhttp://www.geeksww.com/tutorials/database_management_systems/mysql/tips_and_tricks/mysql_primary_key_vs_unique_key_constraints.php

を確認することができます。単純化の方法は、図書館のカードカタログのように考えることです。 MySQLは正しい方向を指しています。

検索速度を向上させるためにユニークキーも使用されていますが、重複した項目が存在しないという制約があります(xはyとx == yの2つのxとyがありません)。次のように

manualはそれを説明する:

UNIQUEインデックスは、インデックス 内のすべての値は別個でなければならないというような制約を作成します。既存の行に一致するキー値 を持つ新しい行を追加しようとすると、エラーが発生します。この制約は、BDBストレージエンジンを除くNULL値に を適用しません。他のエンジンの場合、 UNIQUEインデックスは、 NULLを含む列の複数のNULL値を許可します。 UNIQUE索引の列に接頭部の値を指定する場合、 の列の値は接頭部内で一意でなければなりません。

プライマリキーは「特別な」ユニークキーです。それは基本的にユニークなキーですが、何かを識別するために使われます。

このマニュアルでは、インデックスの一般的な使用方法について説明しています(here)。

MSSQLでは、概念は似ています。インデックス、ユニーク制約、プライマリキーがあります。

テストされていないが、私は、MSSQL同等物があると信じて:

CREATE TABLE tmp (
    id int NOT NULL PRIMARY KEY IDENTITY, 
    uid varchar(255) NOT NULL CONSTRAINT uid_unique UNIQUE, 
    name varchar(255) NOT NULL, 
    tag int NOT NULL DEFAULT 0, 
    description varchar(255), 
); 

CREATE INDEX idx_name ON tmp (name); 
CREATE INDEX idx_tag ON tmp (tag); 

編集:上記のコードが正しいとテストされています。しかし、私はそれを行うためのより良い構文があると思う。私はSQLサーバーを使用しているので、しばらくして、明らかに私はかなり忘れてしまった:)。

+1

すばらしい説明!コードもうまくいきます。どうもありがとうございました! – sura2k

+0

問題ありません。お役に立てて嬉しいです :)。 – Corbin

+0

マニュアルの正しい場所に私を指摘してくれてありがとう! – ptpaterson

3

MySQLの一意キーと主キーが行を識別します。 1つのテーブルにはプライマリキーは1つしか存在できませんが、1つ以上のユニークキーがあります。キーは単なるインデックスです。詳細は

あなたはこれを試してみてhttp://gathadams.com/2008/02/07/convert-mysql-to-ms-sql-server/

+0

@Paul Bellora、あなたの説明は私よりもはっきりしています。すばらしいです。 – Wazan

+0

さて、私はドキュメントを引用しましたが、変換に関する第2の部分は見ませんでした。私はコービンの答えがうまくいっていると思う。 –

23

ただ、他の回答に追加するには、documentationはこの説明を与える:

  • KEYは通常INDEXの同義語です。キー属性PRIMARY KEYは でも列定義に指定するとKEYと指定できます。この は、他のデータベースシステムとの互換性のために実装されました。

  • UNIQUEインデックスは、インデックス のすべての値が異なる必要があるような制約を作成します。既存の行に一致するキー値 を持つ新しい行を追加しようとすると、エラーが発生します。すべてのエンジンについて、UNIQUE インデックスは、NULLを含むことができる列の複数のNULL値を許可します。

  • PRIMARY KEYは、すべてのキー列を として定義しなければならないユニークなインデックスです。NOT NULLです。これらは明示的にNOT NULLとして宣言されていない場合は、MySQLの はとても暗黙的に(そして静かに)それらを宣言します。テーブルは1つだけ PRIMARY KEYを持つことができます。 PRIMARY KEYの名前は常にPRIMARYです。したがって、他の種類のインデックスの名前として を使用することはできません。関連

+0

あなたのすべてをありがとう! – sura2k

+0

他のデータベースシステムとの互換性?他のDBMSがキーではないもの(索引)に "KEY"という言葉を使用しているのは何ですか?私はいつもそれがちょっとしたMySQLの奇妙さだと思っていました - そして、MySQLの作者は実際にキーが何であるかを知っていません:) – sqlvogel

関連する問題