1

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

我试过这个 -

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

但这会不必要地更新 userId。

我怎样才能在userId这里插入?

4

3 回答 3

2
INSERT  INTO users 
        (userId) 
SELECT  ?
WHERE   NOT EXISTS
        (
        SELECT  * 
        FROM    users 
        where   userId = ?
        )
于 2013-05-18T20:37:13.923 回答
1

您可以使用

 INSERT IGNORE INTO users (userId) VALUES (?) 

但是您应该了解为什么要忽略错误。

于 2013-05-18T20:37:16.710 回答
0

当表是 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 注入问题和更多功能,并且只调用一次数据库。

于 2013-05-18T20:57:33.087 回答