我正在使用 PreparedStatement 来准备 sql 查询。当且仅当它不存在时,我想在表中插入一行。
我试过这个 -
INSERT INTO users (userId) VALUES (?) ON DUPLICATE KEY UPDATE userId = ?
但这会不必要地更新 userId。
我怎样才能在userId
这里插入?
INSERT INTO users
(userId)
SELECT ?
WHERE NOT EXISTS
(
SELECT *
FROM users
where userId = ?
)
您可以使用
INSERT IGNORE INTO users (userId) VALUES (?)
但是您应该了解为什么要忽略错误。
当表是 innodb 时,on duplicate key 无法正常工作。它正是您所描述的问题。如果您需要innodb的功能,那么您应该首先检查该行是否存在,否则您可以将表转换为myisam表。
编辑:如果您需要在决定插入或更新之前检查该行是否存在,那么我建议您使用存储过程。
DELIMITER //
CREATE PROCEDURE adjustusers(IN pId int)
BEGIN
DECLARE userid int;
select count(id) into userid from users where id = pId;
if userid = 1 then
update users set id = pId where id = pId;
else
insert into users(id) values(pId);
end if;
END //
DELIMITER ;
预编译存储过程,就像预编译语句一样。因此没有 SQL 注入问题和更多功能,并且只调用一次数据库。