繁体   English   中英

检查mysql中是否存在一行

[英]check if a row in mysql exists

我在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')) 

(请知道我知道在这样的查询中输入值会带来安全风险,但这仅是为了帮助解释我的问题。)

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

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

如果useridemailid是唯一对,则它们应该是表的主键-而不是id值。 ORM通常更喜欢将主键设置为单列,以简化查询的构造,但是这种方法会降低性能。 需要多于一列的任何内容通常称为“复合”-主键,唯一约束/索引,外键等。

ANSI的做法是使用MERGE语句,但是MySQL不支持该语法,因为它已经具有ON DUPLICATE KEY UPDATEREPLACE INTO来提供相同的功能。

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

您真的可以在一个调用中简单地完成它-但是存储过程不好,不是吗?

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 ;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM