私はこの SO-questionを参照しています。ここで、最初の回答では、
UNIQUE は、インデックスのすべての行が一意でなければならないインデックスを指します。つまり、同じ行が、このインデックス内のすべての列について、別の行と同じ非 NULL 値を持つとは限りません。UNIQUE インデックスはクエリの高速化に使用されるだけでなく、データを制限するためにも使用できます。データベース システムでは、データの挿入または更新時にこの個別の値のルールを破ることが許可されていないためです。
私の英語は一番上手ではないので、それはどういう意味なのか気になります。
同じ行が、このインデックスのすべての列について、別の行と同じ非 NULL 値を持つとは限りません
これを私の実際の問題とすばやく結び付けるために、これが私のシナリオです。私は3つのテーブルを持っています
game(gameID, ...), PK(gameID)
player(gameID, playerName, ...), PK(gameID, playerName), FK(gameID)
prop(gameID, playerName, c1, c2, c3, ...) PK(gameID, playerName), FK(gameID, playerName)
これで、ゲームに接続されたプレイヤーは 1-n 個の小道具を選択できるようになりました。このようなプロップでc1 - c3
は、トランプの値、より正確には {1,2,3, ..., T, J, Q, K, A} を表しています。
このような 3 枚のカードの組み合わせは同じ値で構成できますが、組み合わせはゲーム内で 1 回しか選択できません。たとえば、プレイヤーは{2,2,3}
とを選択できます{A,2,3}
が、そのゲームでは、他のプレイヤーは同じ組み合わせを再度選択することはできません。
前文に戻りますが、ステートメントでは 3 つの要素c1, c2, c3
が宣言されていません(宣言されていない場合、例の最初の組み合わせは不可能です)。ゲーム内での組み合わせの一意性を保証するための制約として使用できないということですか? これは使用する良い例ですか? 私の特定のケースで 2 つのバリアントを使用する際の違いは何ですか?UNIQUE
CREATE TABLE
UNIQUE(gameID, c1, c2, c3)
INDEX(gameID, c1, c2, c3)
最後に、CREATE TABLE
その 3 番目のテーブルのステートメントは次のようになります。
create table prop(
gameID INTEGER NOT NULL,
playerName VARCHAR(25) NOT NULL,
isBB BOOLEAN NOT NULL DEFAULT FALSE,
card1 VARCHAR(1) NOT NULL,
card2 VARCHAR(1) NOT NULL,
card3 VARCHAR(1) NOT NULL,
PRIMARY KEY (gameID, playerName),
FOREIGN KEY (gameID, playerName) REFERENCES player(gameID, playerName) ON DELETE CASCADE,
UNIQUE(gameID, c1, c2, c3) /* OR INDEX(gameID, c1, c2, c3)?
)ENGINE=INNODB;