19

今日、2 つの列 (tsql) を使用して主キーを作成できることがわかりました。PK は一意である必要がありますが、両方の列は一意ではありません (コンボは一意である必要があります)。

とてもかっこいいと思いました。私が(mysql)データベースを間違って実行していると人々が私に怒鳴った場所で、少なくとも2つのSOの質問がありました。だから...これは私にいくつかの疑問を残します

これは私が思うことをしますか?

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'
4

8 に答える 8

31

あなたはこれを考えすぎています:

  • 主キーは (関係する列の数に関係なく) 一意でなければなりません
  • あなたの主キーは2つの列a、bです

したがって、a と bは共に一意でなければなりません。

a と b の個々の値は関係ありません。

于 2013-01-08T01:32:32.707 に答える
4

はい、これは SQL で行う通常のことであり、機能します (複数のフィールドが一緒になって一意の値を構成する複合主キーを持つ)。

2 つの注意事項:

  1. 必要であることを確認してください。それはしばしばそうです、そしてそれは大丈夫です。ただし、データ モデルをさらに正規化する必要があることを示している場合もあります。

  2. および ab を別のテーブルからの外部キーにしてから、それらをテーブルの複合主キーにしたくないと考えています。一方のユーザー ID が削除され、もう一方のユーザー ID が削除されないカスケード削除を設定するとどうなりますか? したがって、複合主キーは問題ありませんが、「無関係な」外部キーから取得する必要はありません。

于 2013-01-08T01:40:17.557 に答える
3

はい、重複しないように、複合キーであるPRIMARY_KEYを重複させることに注意する必要があります。

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

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

于 2013-01-08T01:25:56.603 に答える
2

また、注意すべき点が 1 つあります。主キーは、MySQL で自動的にインデックス化されます。ここで述べたように、主キーで言及する列の順序はパフォーマンスにとって重要です

于 2014-05-05T10:16:08.683 に答える
1

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

この例では、2 つのプライマリがあります。つまり、col ペアごとに一意の値を 1 つだけ持つことができます。たとえば、col 'a' と 'b' がプライマリで 'c' がそうでない場合: a|b|c 1,2,3 は動作します 1,4,5 は動作し、5,1,6 は動作します 9,1,10 は動作します

ただし、9,8,10 9,8,6 を持つことはできません。その (9,8) ペアでは、1 つの一意の値しか持てないためです...

それは理にかなっていますか、それとももっと詳しく説明してほしいですか?

于 2013-01-08T01:25:43.453 に答える
0

説明を簡単にするために、1 つのテーブルのみを使用します。2 つの int 列を持つテーブルを作成し、それらの両方に PK を一緒に作成します。質問のとおりです。

create table test(
  a  INT  NOT NULL ,
  b  INT  NOT NULL ,
  PRIMARY KEY(a,b));

これで、エラーが発生するまで行を追加できます

insert into test values(1,1); 
Query OK, 1 row affected (0,00 sec)

insert into test values(1,2); 
Query OK, 1 row affected (0,00 sec)

insert into test values(1,1); 
ERROR 1062 (23000): Duplicate entry '1-1' for key 'PRIMARY'

この最後のステートメントが実行されると、PK を構成する 2 つの列の結合された値が一意でなくなるため、これは論理的です。

PK ではないため、値 1 の 2 倍を a に格納できます。PK は、列 a と b の合計値です。

于 2019-09-30T15:14:24.580 に答える