我正在使用PreparedStatement来准备SQL查询。当且仅当它不存在时,我想在表中插入一行。
我试过了 -
INSERT INTO users (userId) VALUES (?) ON DUPLICATE KEY UPDATE userId = ?
但这会不必要地更新userId。
如何在此处插入userId
?
答案 0 :(得分:2)
INSERT INTO users
(userId)
SELECT ?
WHERE NOT EXISTS
(
SELECT *
FROM users
where userId = ?
)
答案 1 :(得分:1)
您可以使用
INSERT IGNORE INTO users (userId) VALUES (?)
但是你应该理解为什么你想要忽略错误。
答案 2 :(得分:0)
无法正常工作。它创建了您正在描述的问题。如果你需要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注入问题和一些更多功能,只有一次调用数据库。