我在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'))
(请知道我知道在这样的查询中输入值是一个安全风险,这只是为了帮助解释我的问题。)
编写查询的最佳方法是什么?可以用一个查询编写吗?
答案 0 :(得分:3)
它不能写为单个查询,因为主键不是您要查找的两列 - 它只是id
列。
如果userid
和emailid
是唯一对,则它们应该是表的主键 - 而不是id
值。 ORM通常更喜欢主键是单列,以使查询构造更容易,但该方法会受到性能的影响。任何需要多列的东西通常称为“复合” - 主键,唯一约束/索引,外键等。
执行此操作的ANSI方法是MERGE语句,但MySQL不支持语法,因为它已经有ON DUPLICATE KEY UPDATE
和REPLACE 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 ;