2017-08-25 11 views
1

私はMySQLを使用しています。テーブルhandには固定量のcardが含まれています。この例では、実際には8が必要です)。そして、私はこれらのすべてを格納する必要がありますhandしかし、既存のhandを複製することなく。同じテーブルを指す複数の外部キーを含むテーブルの(My)SQLテーブル構造を構築する方法

「複製する」とは、同じデータを含む2つのレコード(手(1,2,3)や手(2,1,3)など)を避けることを意味します。

私は現在、この持っている:

CREATE TABLE card 
(
    id int(11) NOT NULL, 
    name varchar(255) NOT NULL, 
) 

CREATE TABLE hand 
(
    id int(11) NOT NULL, 
    card_1 int(11), 
    card_2 int(11), 
    card_3 int(11) 
) 

ALTER TABLE card ADD PRIMARY KEY (id) 
ALTER TABLE hand ADD PRIMARY KEY (id) 

ALTER TABLE hand ADD FOREIGN KEY (card_1) REFERENCES (card.id) 
ALTER TABLE hand ADD FOREIGN KEY (card_2) REFERENCES (card.id) 
ALTER TABLE hand ADD FOREIGN KEY (card_3) REFERENCES (card.id) 

をそれはINSERT前に、既存のhandをチェックし、すべての可能性を試すために私を強制し、それが1 handで8 card秒で書き込むように時間がかかるでしょうリクエストです。

これを行う簡単な方法はありますか?

答えて

2

私は、手を保管する際に少し余分なロジックを置くことをお勧めします。

カードを挿入する前に、まずカードを並べ替えるとします。たとえば、それらを低から高にソートすると、データベースには手(2,3,1)はなく、手(1,2,3)のみが分類されます。そうすれば、検索が簡単になります。または、独自の制約を置くと、新しい手を挿入して、手が存在する場合にスローする制約エラーを取得できます。

+0

Noobのでこれを表すカード1,2,3が含まれている場合は、コメントの前に完全な答えをお読みください。ユニーク制約はサイドノートにすぎません。要点は、カードを保管する前に手でカードを分類することです。それが不明な場合に備えて、テキストを少し修正しました。 – GolezTrol

+0

私はそれを今理解しています:)申し訳ありませんがこれは意味をなさないです。 – Noob

-1

プライマリキーとして別のID列が必要ですか?そうでなければ、重複値を自動的に破棄する、 ALTER TABLE hand ADD PRIMARY KEY (card_1,card_2,...card_n) のような主キーとしてこれらのカード列を使用することができます。

+0

ユニークな制約やユニークなインデックスと同じですが、質問に記載されている問題は解決しません。同じように扱われるべき2,1,3と1,2,3を挿入することはできます。 – GolezTrol

-1

あなたは手とカードの間に1対1の関係があります。複合主キーと単一カード列を使用してこれを表す必要があります。

CREATE TABLE hand(
id INT, 
card INT, 
FOREIGN KEY card REFERENCES card(id), 
PRIMARY KEY (id,card) 
); 

手101は、その後、あなたが

INSERT INTO hand(101,1); 
INSERT INTO hand(101,2); 
INSERT INTO hand(101,3); 
+0

これは意見であり、データベースを正規化する方法によって異なります。ユーザビリティとパフォーマンスのために、特に限られた枚数のカードを使用できる特定のゲームのデータベースがある場合は、非正規化することができます。それを除いて、あなたの答えは有用な発言かもしれませんが、それは決して質問に答えません。 – GolezTrol

関連する問題