2013-01-08 12 views
18

今日、私はあなたが2つの列(tsql)を使って主キーを持つことができることを知りました。 PKは一意である必要がありますが、両方の列は一致しません(コンボは一意でなければなりません)。mysqlの主キーとして2つの列?

とてもクールだと思いました。少なくとも2つのSOの質問がありました。私が私の(mysql)データベースを間違っているという人が私に叫んだところ、1人だけが間違っていると言っていました。だから...これは私にある程度の疑念を残す

これは私がそれをすると思いますか?

create table User(
    id INT primary key AUTO_INCREMENT , 
    ipaddr TEXT NOT NULL , 
    email TEXT NOT NULL 
); 
create table test(
    a INT NOT NULL , 
    b INT NOT NULL , 
    dummy INT NOT NULL , 
    FOREIGN KEY (a) REFERENCES User(id), 
    FOREIGN KEY (b) REFERENCES User(id), 
    PRIMARY KEY(a,b) 
); 

私が(コンボは一意でなければなりません。しかし、列に同じ値が一意である必要はありません)何を考えてやっているように見えるので、私は以下の走りました。私は何かを知っているべきですか? mysqlに関して私にこれを言及した理由は誰もいないでしょうか?

mysql> insert into test(a,b,dummy) select 1,1,1; 
Query OK, 1 row affected (0.03 sec) 
Records: 1 Duplicates: 0 Warnings: 0 

mysql> insert into test(a,b,dummy) select 1,2,2; 
Query OK, 1 row affected (0.03 sec) 
Records: 1 Duplicates: 0 Warnings: 0 

mysql> insert into test(a,b,dummy) select 2,1,3; 
Query OK, 1 row affected (0.03 sec) 
Records: 1 Duplicates: 0 Warnings: 0 

mysql> insert into test(a,b,dummy) select 2,2,4; 
Query OK, 1 row affected (0.03 sec) 
Records: 1 Duplicates: 0 Warnings: 0 

mysql> insert into test(a,b,dummy) select 1,2,5; 
ERROR 1062 (23000): Duplicate entry '1-2' for key 'PRIMARY' 
+3

このことを私たちに示す方法は、正しく理解していることを示唆しています。 –

+0

@ s.bandara yep。私はちょうど肛門のnoobsまでこれをチョークするつもりです。 (私のテーブルが悪いデザインだと叫んで、私はPKが必要ですが、上記を示唆していません) –

+0

なぜ、あなたがこれをやりたいのかについての1つのポイントが正当化されます。 –

答えて

1

私はペアの列が一緒に何が起こっているのかと信じているが、主です。たとえば、重複するプライマリ列を持つことはできません。例:col "a"がプライマリの場合、aと同じ値を持つ2つの行を持つことはできません。

この例では、2つのプライマリがあります。これは、各列対に対して一意の値を1つしか持てないことを意味します。例えば COL '' と 'B' が主であり、 'C' がない場合: | B | C 1,2,3 1,4,5は と 5,1,6作品ワークス 9,1,10

に動作しますが、あなたが持つことはできません:あなたが唯一の一意の値を持つことができる(9,8)ペアのため 9,8,10 9,8,6 ...

これは意味があるのですか、それとも私がさらに詳しく説明してほしいですか?

2

はい、あなたは複製されないあなたのケースで組み合わせキーであるあなたのPRIMARY_KEYを複製するのを認識する必要があります。

とにかく2つのPKを設定すると、署名がPK1 + PK2であることを意味します。そのため、両方ではなくPK1またはPK2を複製できます。

私はあなたがこれを考える上である

30

を助けたことを願っています:

  • 主キー(関与している列の数に関係なく)
  • 一意である必要があり、あなたの主キーは、2つの列でありますa、b

したがって、aとb を合わせてはuniq ue。

aとbの個々の値は無関係です。

+2

私はちょうど私の背後にビットを取得しないようにしたいと思った。むしろ2つの質問のために私に叫んで、idと呼ばれるint列を追加するように頼んでいる人は、これを示唆している可能性があります。x –

4

はい、これはSQLで行う通常の処理で、複数のフィールドが一意の値を構成する複合主キーがあります。

2つのノート:

  1. はそれが必要だことを確認してください。それはしばしばであり、それは上手くいく。しかし、データモデルを正規化する必要があることも時々あります。

  2. 私はあなたが作って、別のテーブルからの外部キーであることを考えずに、テーブルの複合主キーにしたいと思っています。カスケード削除を設定すると、1つのユーザーIDは削除されますが、削除されないのはどうなりますか?コンポジットのプライマリ・キーは問題ありませんが、「無関係」な外部キーからは欲しくなりません。

+1

+1しかし、 'しかし、あなたは〜から来たくありません。無関係な "外部キー"と呼ばれる。私はカスケード削除(atm私はない)を行うと言うことができます。削除されたユーザーとしてaまたはbのいずれかの行がすべて削除されますか?他の行はありませんか?私はそれで大丈夫です。そのより多くのクロスリファレンステーブル(ダミーは本当にデータと呼ばれる必要があります) –

4

あなたの考えは良いです。私は、データベース設計をより論理的、管理しやすく、読みやすいものにするために、複数フィールドの主キーを頻繁に使用します。一意の名前を持つような複数フィールドの主キーを考えることができます。

マルチフィールドプライマリキー:

(First ,Middle, Last) 

値の例:たとえば

('Michael', 'A.', 'Kline') 

「最初の」名「マイケル」および/または「中東で多くの人々が存在することができ'name' A. 'あなたのデータベースに関する限り、「Michael A. Kline」は1つしか存在できません。

通常、複数フィールドの主キーは他のテーブルの他の主キーの組み合わせであり、レコードの内容は特定のキー値に関連するコンテンツを表します。例:

Table #1: Student Records (KEY: student_id) 
Table #2: Course Records (KEY: course_id) 
Table #3: Student Grades (KEY: student_id, course_id) 

希望します。

2

注意すべき点: 主キーはMySQLで自動的に索引付けされます。 プライマリキーに記載されている列の順序は、前述のようにパフォーマンスに関して重要です。here

関連する問題