如果行尚不存在,MySQL SELECT 或 INSERT

标签 mysql sql database insert

我有 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/

相关文章:

php - CakePHP - 代码 $hasOne 的结果

php - PHP 和 MYSQL 制作搜索页面时遇到的问题

c# - SQL Server Report Builder 3 使用带参数的 SQL IN 运算符不起作用

mysql - 按相似字段分组的嵌套选择查询

java - JPA:保留具有 OneToMany 关系的 2 个实体的问题

sql - VBA - Access - 使用来自用户表单的新数据更新表

php - 回显评论会返回所有注册用户的所需评论

mysql - 获取最后的余额符号变化(Mysql

sql - 错误 : ALTER DATABASE statement not allowed within multi-statement transaction

MySQL 100% CPU 每 12-18 小时