使用IF语句避免使用SQL查询添加重复项?

时间:2014-01-03 02:10:31

标签: mysql sql phpmyadmin

我正在尝试了解数据库和SQL,这是一个我遇到问题的问题:如何检测新条目是否重复,如果是,则不是 discard 新条目,但是将其与旧条目合并?

一个例子让它更清晰。假设我正在建立一个我的视频游戏集合的数据库。我的列是'Title'(varchar),然后是我拥有游戏的每个平台的布尔列,因为有些游戏在多个平台上。

我买了World of Goo,然后去我的数据库说

INSERT INTO `collections`.`games` (`Title`,`Windows`) VALUES ('World of Goo','1');

易。但六个月之后,我又在Android上买了它,因为我非常喜欢那款游戏而且想在床上玩它。我现在要做的是编写一个说

的查询
IF (select * from `games` where title = 'World of Goo') {
    UPDATE `games`
    SET `Android` = '1'
    WHERE `title` = 'World of Goo';
} ELSE {
        INSERT INTO `collections`.`games` (`Title`,`Android`) VALUES ('World of Goo','1'); 
}

(我知道第一行是错误的,我需要写“如果查询返回1个或更多结果”,但暂时忽略它。)

现在......我知道我可以用PHP脚本做到这一点。但是我不想使用比必要更复杂的解决方案 - 有没有办法单独使用SQL?

(这是一个问题的例子,我知道实际上我记得我拥有一个游戏并且只是编写查询来更新它。)

3 个答案:

答案 0 :(得分:1)

MySQL使用INSERT ... ON DUPLICATE KEY UPDATE实现了 UPSERT 语句。

INSERT INTO collections.games (Title, Android) 
VALUES ('World of Goo', '1')
ON DUPLICATE KEY UPDATE Android = '1'

但是为了处理上述声明,您需要使列Title唯一。

ALTER TABLE games ADD CONSTRAINT games_uq UNIQUE (Title)

答案 1 :(得分:0)

您使用MySQL的标签注意到了。我的建议是使用INSERT INTO ... ON DUPLICATE KEY UPDATE并将标题作为主键(声明为UNIQUE):

INSERT INTO `collections`.`games` (`Title`,`Windows`) VALUES ('World of Goo','1') ON DUPLICATE KEY UPDATE `Windows`=VALUES(`Windows`)

答案 2 :(得分:0)

我会使用insert into ... on duplicate key

INSERT INTO  games (Title,Android) VALUES ('World of Goo','1') ON DUPLICATE KEY UPDATE Android=1

请记住,您的标题列必须是独一无二的。如果不是,请将其与:

CREATE UNIQUE INDEX unique_title
ON games (Title)

无论如何,我认为你的模型不是最好的,因为如果你将来考虑一个新的平台,你将不得不改变表格,并且可能会更新许多记录。

我更喜欢游戏桌,平台表和game_rel_platform表,您可以在其中为每个gameid-platformid对添加一个条目