2011-11-14 21 views
4

私は少し初心者です。私はプライマリキーの周りを外来のキーとして捉えられません。私にとっては、外部キーはテーブルの2つの行を接続することを意味します。したがって、それは、pictureテーブルの外部キーとして、例えば、userテーブルのusernameを使用するための論理的な意味になるだろう。これは、その行の画像が指定されたユーザーに属していることを意味します。しかし、一般的なプラクティスでは、無意味な数字をプライマリIDとして使用することが好まれます。さらに、外部キーは、主キーを参照する必要があり/参照する必要があります。プライマリキーがわからない場合は、別のユニークな列(この場合はusername)を知っていますが、プライマリキーを別のMySQLステートメントから取得する方法、または外部キーポイントを非プライマリキーにする方法はありますか?MySQL非プライマリの外部キー

答えて

7

さらに外部キーが/主キーを参照してください必要があります。プライマリキーがわからないのですが、別のユニークな列(この場合はユーザー名)を知っていれば、別のMySQLステートメントからプライマリキーを取得する方法と、外部キーポイントを非プライマリキーにする方法はありますか?

CREATE TABLE user 
(userid INT NOT NULL 
, username VARCHAR(20) NOT NULL 
--- other fields 
, PRIMARY KEY (userid) 
, UNIQUE KEY (username) 
) ENGINE = InnoDB ; 

CREATE TABLE picture 
(pictureid INT NOT NULL 
, username VARCHAR(20) 
--- other fields 
, PRIMARY KEY (pictureid) 
, FOREIGN KEY (username) 
    REFERENCES user(username) 
) ENGINE = InnoDB ; 

をそして他のテーブル内のすべての外部キーがこのユニークなキー(username)を参照している場合は、何がある:

はいあなたは別の一意のキーを持っている場合、あなたはそれを参照する外部キーを持つことはできません意味のないIDを持つことを指す。それをドロップしてusernameのテーブルのPRIMARY KEYにすることができます。

(編集:) が最初のプライマリまたはユニークなインデックスは、デフォルトでは、テーブルのクラスタ化インデックスを作られているので、それを基準として使用されていない場合でも、InnoDBテーブルの自動インクリメントの主キーを持ついくつかのポイントがあります。プライマリcharフィールドにはINSERTUPDATEステートメントのパフォーマンスの欠点がありますが、SELECTクエリではパフォーマンスが向上します。何を使用するかに関する議論については


、サロゲート(意味のない、自動生成)、または自然キー、および対象の異なるビューが、これを読んで: surrogate-vs-natural-business-keys

+0

私はダミーのプライマリキーを持っている唯一の理由は、誰もがそれが素晴らしいアイデアだと言っているからです。ただし、外部キーとして使用する主キーを見つけて検索する必要があるため、挿入が非常に面倒です。 – puk

5

あなたは主キーに「意味のない」値を使用する理由は、「意味のある」の値は随時変更する傾向があるということです。ユーザーの場合は

の名前が変更され、あなたが行くと、他のテーブルに多くの行を変更する必要がありますする必要はありません。これは、意味のないID(通常は自動インクリメント)を与えるのが通常の方法です。

+0

を、私は、この情報に感謝しますが、可能性がありおそらくプライマリIDを外部キーとして使用する方法を追加しますか? – puk

1

私が最初にそれらの列で作成したインデックスがある場合は、任意の列(または列)への外部キーポイントを持つことができると思います。

CREATE INDEX user_username_idx ON user(username); 

を実行してから外部キーが動作するはず作成してみてください。

+0

私はこれを試しましたが、うまくいきませんでした。だれかがインデックスを追加して外部キーとして参照しようとしましたか? – Rajesh

関連する問題