我有一个像这样创建的表:
'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 = ?
答案 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;