我正在尝试了解数据库和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?
(这是一个问题的例子,我知道实际上我记得我拥有一个游戏并且只是编写查询来更新它。)
答案 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对添加一个条目