如果存在则更新,否则插入(没有唯一键)

时间:2016-08-28 18:27:58

标签: mysql sql-update

我有一个像这样创建的表:

 'CREATE TABLE `boss_kills` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `characterid` int(11) DEFAULT NULL,
  `mobid` int(11) DEFAULT NULL,
  `amount` int(11) NOT NULL DEFAULT ''0'',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=25 DEFAULT CHARSET=latin1'

目标:我试图创建一个玩家杀死游戏老板的系统,并记录老板的ID和玩家的ID桌子。我希望能够编写一个查询,如果玩家已经使用特定boss登录,则会更新,如果他或她不是,则插入。

研究:我在网上进行了大量研究,人们建议使用INSERT INTO ... ON DUPLICATE KEY UPDATE,但这只有在您知道主键或有唯一密钥时才有效,有或知道。

尝试:我已经尝试了

IF EXISTS (...) THEN UPDATE (...) ELSE INSERT(...) 

UPDATE (...) IF @@ROWCOUNT = 0 INSERT INTO (...)

但他们不能工作。我得到语法错误。

如果需要,我可以提供上述尝试引发的错误。我当前尝试更新的代码是这样的(但它会引发SQL语法错误):

尝试1:

UPDATE boss_kills 
  SET amount = amount + 1 
  WHERE characterid = ? AND mobid = ? 
IF @@ROWCOUNT = 0 
  INSERT INTO boss_kills (characterid, mobid, amount) VALUES (?, ?, 1) 

尝试2:

IF NOT EXISTS (SELECT id FROM boss_kills WHERE characterid = ? AND mobid = ?) 
THEN 
  INSERT INTO boss_kills VALUES (DEFAULT, ?, ?, 1) 
ELSE 
  UPDATE boss_kills SET amount = amount + 1 WHERE characterid = ? AND mobid = ?

1 个答案:

答案 0 :(得分:1)

似乎(characterid, mobid)可以为您的表创建唯一的索引约束,从而允许您使用INSERT ... ON DUPLICATE KEY UPDATE

使用以下脚本创建表格

CREATE TABLE boss_kills (
  id int(11) NOT NULL AUTO_INCREMENT,
  characterid int(11) DEFAULT NULL,
  mobid int(11) DEFAULT NULL,
  amount int(11) NOT NULL DEFAULT 0,
  PRIMARY KEY ( id ),
  UNIQUE ( characterid, mobid )
) ENGINE=MyISAM AUTO_INCREMENT=25 DEFAULT CHARSET=latin1;

请注意,我已删除了表和列名称的反引号 - 它们不是必需的。

插入行

INSERT INTO boss_kills (characterid, mobid, amount)
  VALUES (?, ?, 1)
  ON DUPLICATE KEY UPDATE amount = amount + 1;
相关问题