425

1 つのテーブルに複数の主キーを設定できますか?

4

12 に答える 12

620

テーブルは、2 つ以上の列から作成された主キーである複合主キーを持つことができます。例えば:

CREATE TABLE userdata (
  userid INT,
  userdataid INT,
  info char(200),
  primary key (userid, userdataid)
);

更新: これは、複合主キーのより詳細な説明へのリンクです。

于 2008-10-20T10:00:10.060 に答える
217

主キーは 1 つしか持てませんが、主キーには複数の列を含めることができます。

テーブルに一意のインデックスを設定することもできます。これは、一意の値を強制するという点で主キーのように機能し、それらの値のクエリを高速化します。

于 2008-10-20T09:57:40.817 に答える
44

テーブルは複数の候補キーを持つことができます。各候補キーは、UNIQUE であり、まとめて、NOT NULL である列または列のセットです。したがって、任意の候補キーのすべての列に値を指定するだけで、基準を満たす行が 1 つ存在するか、または行がまったくないことを判断できます。

候補キーは、リレーショナル データ モデルの基本概念です。

1 つのテーブルに複数のキーが存在する場合、候補キーの 1 つを主キーとして指定するのが一般的です。また、テーブルへの外部キーが、他の候補キーではなく、主キーを参照するようにすることも一般的な方法です。

これらの方法をお勧めしますが、リレーショナル モデルには、候補キーの中から主キーを選択する必要があるものは何もありません。

于 2008-10-21T21:00:53.753 に答える
16

これは、主な質問と@Kalmiの質問の両方に対する答えです

複数の自動生成列を持つことのポイントは何ですか?

以下のコードには複合主キーがあります。その列の 1 つは自動インクリメントされます。これは MyISAM でのみ機能します。InnoDB はエラー「ERROR 1075 (42000): Incorrect table definition; there can only be one auto column and it must be defined as a key」を生成します。

DROP TABLE IF EXISTS `test`.`animals`;
CREATE TABLE  `test`.`animals` (
  `grp` char(30) NOT NULL,
  `id` mediumint(9) NOT NULL AUTO_INCREMENT,
  `name` char(30) NOT NULL,
  PRIMARY KEY (`grp`,`id`)
) ENGINE=MyISAM;

INSERT INTO animals (grp,name) VALUES
    ('mammal','dog'),('mammal','cat'),
    ('bird','penguin'),('fish','lax'),('mammal','whale'),
    ('bird','ostrich');

SELECT * FROM animals ORDER BY grp,id;

Which returns:

+--------+----+---------+
| grp    | id | name    |
+--------+----+---------+
| fish   |  1 | lax     |
| mammal |  1 | dog     |
| mammal |  2 | cat     |
| mammal |  3 | whale   |
| bird   |  1 | penguin |
| bird   |  2 | ostrich |
+--------+----+---------+
于 2011-06-17T08:16:55.323 に答える
6

他の人が指摘したように、複数列の主キーを持つことが可能です。ただし、キーによって導入されない機能的な依存関係がある場合は、関係を正規化することを検討する必要があることに注意してください。

例:

Person(id, name, email, street, zip_code, area)

の間には機能的な依存関係が存在する可能性がありますが、id -> name,email, street, zip_code and area 多くの場合、 azip_codeは a に関連付けられているareaため、 の間に内部的な機能的な依存関係がありzip_code -> areaます。

したがって、それを別のテーブルに分割することを検討できます。

Person(id, name, email, street, zip_code)
Area(zip_code, name)

これは、第 3 正規形と一致します。

于 2011-06-17T08:27:11.970 に答える
3

「主キー」という用語を、自動メカニズムによって生成された値を取得する整数列を正確に意味するために使用する人もいます。たとえばAUTO_INCREMENT、MySQL またはIDENTITYMicrosoft SQL Server で。この意味で主キーを使用していますか?

その場合、答えは使用しているデータベースのブランドによって異なります。MySQL では、これを行うことはできず、エラーが発生します。

mysql> create table foo (
  id int primary key auto_increment, 
  id2 int auto_increment
);
ERROR 1075 (42000): Incorrect table definition; 
there can be only one auto column and it must be defined as a key

他のブランドのデータベースでは、テーブルに複数の自動生成列を定義できます。

于 2008-10-20T17:53:50.107 に答える
1

優れた技術的な回答が、私よりも優れた方法で提供されました。私はこのトピックに追加することしかできません:

許可されていない/受け入れられないものが必要な場合は、一歩下がってください。

  1. 受け入れられない理由の核心を理解してください。
  2. ドキュメント/ジャーナル記事/ウェブなどでさらに掘り下げます。
  3. 現在の設計を分析/レビューし、主要な欠陥を指摘します。
  4. 新しい設計中のすべてのステップを検討してテストします。
  5. 常に前を向いて、適応的なソリューションを作成しようとします。

それが誰かを助けることを願っています。

于 2012-09-16T19:09:51.510 に答える
-3

はい、SQL では可能ですが、MsAccess で複数の主キーを設定することはできません。それから、他のデータベースについては知りません。

CREATE TABLE CHAPTER (
    BOOK_ISBN VARCHAR(50) NOT NULL,
    IDX INT NOT NULL,
    TITLE VARCHAR(100) NOT NULL,
    NUM_OF_PAGES INT,
    PRIMARY KEY (BOOK_ISBN, IDX)
);
于 2009-01-07T11:44:55.743 に答える