检查mysql中是否存在一行

时间:2010-11-22 00:47:34

标签: php mysql

我在mySQL数据库中有一个表,我们称之为'tbl',其中的字段为:

id, userID, favorite, emailID

id是自动增量。 userID存储整数。最喜欢的是是或否。 emailID存储一个整数。

我正在使用PHP进行编程,并希望使用一个查询来查询数据库,以检查userID和emailID组合是否存在。如果是,则更新收藏夹字段,其值为yes或no值,该值来自动态传递给查询的表单。如果它不存在,则将组合插入数据库。

因此,如果我有:

<?php
$userID = 34;
$emailID = 395;
$favorite = "yes"; // could be yes or no.

我不相信下面的查询是正确的,但我知道我想要做的事情:

IF NOT EXISTS 
(SELECT userID, favorite, emailID 
FROM tbl 
WHERE ((userID = '$userID')and(emailID = '$emailID')) 
INSERT INTO tbl (userID, favorite, emailID) VALUES ('$userID', '$favorite', '$emailID')
ELSE UPDATE tbl
SET favorite = '$favorite'
WHERE ((userID = '$userID')and(emailID = '$emailID')) 

(请知道我知道在这样的查询中输入值是一个安全风险,这只是为了帮助解释我的问题。)

编写查询的最佳方法是什么?可以用一个查询编写吗?

3 个答案:

答案 0 :(得分:3)

它不能写为单个查询,因为主键不是您要查找的两列 - 它只是id列。

如果useridemailid是唯一对,则它们应该是表的主键 - 而不是id值。 ORM通常更喜欢主键是单列,以使查询构造更容易,但该方法会受到性能的影响。任何需要多列的东西通常称为“复合” - 主键,唯一约束/索引,外键等。

执行此操作的ANSI方法是MERGE语句,但MySQL不支持语法,因为它已经有ON DUPLICATE KEY UPDATEREPLACE INTO来提供相同的功能。

答案 1 :(得分:2)

我会删除多余的id列并将主键定义为(userID, emailID)的组合,这意味着您对这两个字段的每个不同组合只有一条记录,这似乎是什么你要。然后,您可以使用REPLACE INTO命令,该命令等同于INSERT,但如果主键匹配,则删除任何现有记录。

答案 2 :(得分:0)

你可以在一次通话中真正做到这一点 - 但是sprocs不好吗?

drop procedure if exists insert_update_tbl;
delimiter #

create procedure insert_update_tbl
(
in p_userID int unsigned,
in p_emailID int unsigned,
out p_id int unsigned
)
proc_main:begin

    set p_id  = 0;

    if exists (select 1 from tbl where userID = p_userID and emailID = p_emailID) then
        update tbl set favorite = 1 where userID = p_userID and emailID = p_emailID;
        leave proc_main;
    end if;

    insert into tbl (userID, emailID, favorite) values (p_userID, p_emailID, 0);

    set p_id  = last_insert_id();

end proc_main #

delimiter ;