[英]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
列。
如果userid
和emailid
是唯一对,则它们应该是表的主键-而不是id
值。 ORM通常更喜欢将主键设置为单列,以简化查询的构造,但是这种方法会降低性能。 需要多于一列的任何内容通常称为“复合”-主键,唯一约束/索引,外键等。
ANSI的做法是使用MERGE语句,但是MySQL不支持该语法,因为它已经具有ON DUPLICATE KEY UPDATE
和REPLACE 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.