仅在行不存在时插入

时间:2013-05-18 20:34:13

标签: java mysql sql

我正在使用PreparedStatement来准备SQL查询。当且仅当它不存在时,我想在表中插入一行。

我试过了 -

INSERT INTO users (userId) VALUES (?) ON DUPLICATE KEY UPDATE userId = ?

但这会不必要地更新userId。

如何在此处插入userId

3 个答案:

答案 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时,重复键上的

无法正常工作。它创建了您正在描述的问题。如果你需要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注入问题和一些更多功能,只有一次调用数据库。