如何在“INSERT ON DUPLICATE UPDATE”MySQL 后检索插入或更新的行的 id?

问题描述 投票:0回答:1

我根据玩家的等级来存储我的游戏玩家:

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。

mysql mariadb bulkinsert on-duplicate-key bulkupdate
1个回答
0
投票
INSERT INTO Player(name, level) VALUES (?), ..., (?) ON DUPLICATE KEY UPDATE level = VALUES(level)
RETURNING id

将返回添加/更新的列的

id

然后您可以由此创建删除语句。

不幸的是,当前的限制是必须返回

id
,而不是形成一个临时表,这将使删除变得更容易。

参考:手册:插入返回

© www.soinside.com 2019 - 2024. All rights reserved.