我根据玩家的等级来存储我的游戏玩家:
CREATE TABLE IF NOT EXISTS Player(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL UNIQUE,
level TINYINT UNSIGNED NOT NULL,
PRIMARY KEY(id)
);
我还跟踪每个扮演特定角色的玩家:
CREATE TABLE IF NOT EXISTS PlayerCharacter(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
playerId INT UNSIGNED NOT NULL,
characterId INT UNSIGNED NOT NULL,
PRIMARY KEY(id),
FOREIGN KEY(playerId) REFERENCES Player(id) ON DELETE CASCADE,
FOREIGN KEY(characterId) REFERENCES Character(id) ON DELETE CASCADE,
UNIQUE(playerId, characterId)
);
(在下面的查询中,我使用占位符“?”,因为我使用的是 NodeJS 中准备好的查询。)
我正在编写一个事务的查询,旨在使用由大量数据构建的批量查询来刷新给定字符 ID 的这两个表,这些数据由
[name, level]
数组组成。`该数组中没有重复的名称,因为所有这些潜在的新玩家都是独一无二的。我说“可能是新的”,因为它们已经可以出现在 Player 表中。
这就是为什么我将使用
INSERT INTO Player(name, level) VALUES (?), ..., (?) ON DUPLICATE KEY UPDATE level = VALUES(level);
以便添加新玩家(如果不知道),或者使用新级别更新(如果已知)。其他玩家未受影响。
然后我计划部分清除表 PlayerCharacter 的角色 ID
DELETE FROM PlayerCharacter where characterId = ?
。
我的问题是我需要知道这些行的插入/更新的 id,以便能够在 PlayerCharacter 中插入新行,但这似乎没有我想象的那么简单。
我考虑过使用临时表,但这对于我看来如此“简单”的东西来说感觉过于复杂。也许有一种方法可以首先插入 PlayerCharacter ,让 MySQL 插入或更新表 Player 中的一行,并使用插入或更新的行的 id 作为它在 PlayerCharacter 中插入的行上的playerId ?但我不知道这是否可能,而且对我来说似乎很复杂。在第一个 INSERT ON DUPLICATE UPDATE 查询之后,必须有一种方法以某种方式累积 id。
INSERT INTO Player(name, level) VALUES (?), ..., (?) ON DUPLICATE KEY UPDATE level = VALUES(level)
RETURNING id
将返回添加/更新的列的
id
。
然后您可以由此创建删除语句。
不幸的是,当前的限制是必须返回
id
,而不是形成一个临时表,这将使删除变得更容易。
参考:手册:插入返回