我有 3 个简单的表:
玩家:
如果不存在则创建表玩家(id INTEGER PRIMARY KEY AUTO_INCRMENT,name VARCHAR(20),UNIQUE KEY(名称));
竞技场:
如果不存在则创建表 arenas(id INTEGER PRIMARY KEY AUTO_INCRMENT,名称 VARCHAR(40),UNIQUE KEY(名称));
和要点:
如果不存在点则创建表(playerID INTEGER、arenaID INTEGER、points INTEGER、PRIMARY KEY(playerID、arenaID));
我想在 points
表中插入新行,并在需要时自动向玩家和竞技场插入行,目前我只有简单的插入:
INSERT INTO points (playerID, arenaID, points)
VALUES
(
(SELECT players.id FROM players WHERE players.name LIKE ?),
(SELECT arenas.id FROM arenas WHERE arenas.name LIKE ?),
?
) ON DUPLICATE KEY UPDATE points.points = LEAST(points.points, VALUES(points.points));
?
将被替换为值。
热衷于编辑此 SQL,因此如果没有玩家 (SELECT Players.id FROM Players WHERE Players.name LIKE ?)
那么它将 INSERT 新玩家到此表中,这与竞技场相同。
就像:(我的伪代码)
INSERT INTO points (playerID, arenaID, points)
VALUES
(
(SELECT players.id FROM players WHERE players.name LIKE "Mary" ON KEY NOT EXIST INSERT INTO players (name) VALUES ("Mary")),
(SELECT arenas.id FROM arenas WHERE arenas.name LIKE "BigBoy" ON KEY NOT EXIST INSERT INTO arenas (name) VALUES ("BigBoy")),
200
) ON DUPLICATE KEY UPDATE points.points = LEAST(points.points, VALUES(points.points));
并且仍然插入新的点
行。
最佳答案
您可以使用INSERT IGNORE
语句。
INSERT IGNORE INTO players (name) VALUES (?);
INSERT IGNORE INTO arenas (name) VALUES (?);
INSERT INTO points (playerID, arenaID, points)
VALUES
(
(SELECT players.id FROM players WHERE players.name LIKE ?),
(SELECT arenas.id FROM arenas WHERE arenas.name LIKE ?),
?
) ON DUPLICATE KEY UPDATE points.points = LEAST(points.points, VALUES(points.points));
关于如果行尚不存在,MySQL SELECT 或 INSERT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28300760/