我正在使用MySQL,我希望有一个表hand
,其中包含固定数量的card
s(例如,让我们说3,但实际上我需要8 )。我需要存储这些hand
中的每一个,但不会复制现有的hand
。
通过"复制",我的意思是避免让两条包含相同数据的记录,如hand(1,2,3)和hand(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)
但它迫使我在hand
之前检查现有的INSERT
时尝试各种可能性,并且这是一个需要花费数小时写入8 card
s的请求一个hand
。
有没有一种简单的方法可以实现这一目标?
答案 0 :(得分:2)
我认为最好在储存手中放一些额外的逻辑。
如果您在插入卡之前先对卡进行排序。例如,如果您将它们从低到高排序,那么在数据库中不会是手(2,1,3),而只是手(1,2,3)。这使搜索更容易,或者,如果你对它进行了一个独特的约束,你可以尝试插入一个新的手并抓住它会在手存在时抛出的约束错误。
答案 1 :(得分:-1)
您是否需要单独的id列作为主键?如果没有,那么您可以使用这些卡列作为主键
ALTER TABLE hand ADD PRIMARY KEY (card_1,card_2,...card_n)
这会自动丢弃重复的值。
答案 2 :(得分:-1)
你手牌之间有一对多的关系。您应该使用复合主键和单个卡列来表示它。
CREATE TABLE hand(
id INT,
card INT,
FOREIGN KEY card REFERENCES card(id),
PRIMARY KEY (id,card)
);
如果手101包含1,2,3号牌,那么你用
表示INSERT INTO hand(101,1);
INSERT INTO hand(101,2);
INSERT INTO hand(101,3);