2012-04-11 108 views
0

我有一个程序的2个实例,访问数据库中的1个表。
points只插入一次

game | player1 | player2 
--------|-----------|----------- 
Poker | 5  | 
Skat | 8  | 4 
Bridge |   | 10 

如果PLAYER1,使用第一种情况下,希望他的观点(如扑克牌)保存到表,它必须确信,扑克是否已经存在。如果没有,Poker将与player1的积分一起插入。但是,如果玩家2已经插入了扑克,则只应插入玩家1的点(该行只应该被修改)。

我怎样才能确定,每种游戏只插入一次,在这种情况下,只有插入点(改变)?
我认为,game列必须是唯一的。

我的解决方法是首先查询游戏种类并检查行数。如果有0行,插入游戏和点,如果已经有1行,只插入点。
但是,有没有更好/更快的解决方案,而没有开始查询?

+2

也许你应该重新考虑你的数据库设计。如果碰巧添加更多用户,最好为'用户','游戏'和交叉引用表'user_game'设置表格。 – dgw 2012-04-11 21:32:34

+0

我知道,这只是一个例子。不过谢谢! – user1170330 2012-04-11 21:35:23

+0

18总是...... – 2012-04-11 21:37:41

回答

4
INSERT INTO points (game,player1) VALUES ('Poker',5) 
    ON DUPLICATE KEY UPDATE player1=5; 

欲了解更多信息,请参阅MySQL文档:INSERT ... ON DUPLICATE KEY Syntax

+0

+1,但表格被称为'points'而不是'game'。 – FGreg 2012-04-11 21:31:07

+0

这是否也可能**组合**条目?因此,“扑克”可以多次使用,但每个玩家只能使用一次? “游戏 - 玩家1”的组合应该是唯一的。 – user1170330 2012-04-11 22:11:41

0

将您的插入分解为两个语句。为了这个工作,'游戏'必须是一个独特的列 - 也就是说,没有两个值可以是相同的。

INSERT INTO 'game' VALUES('Poker',null,null); 
UPDATE 'game' SET player1='5' WHERE 'game'='POKER'; 

如果已经存在,第一行不会影响任何内容,因为唯一约束会阻止它。

0

使用replace into语法。请注意,您可以为数据库表创建唯一的约束。

阅读有关替换为here。 阅读关于唯一约束条件here

0
REPLACE INTO points (game,player1) VALUES ('Poker',5);