您好我想建立一个(关注/取消关注)按钮,
如果记录不存在,应该通过“添加”表格 {table columns is UserID and PageID} 来关注页面,
或者如果记录已经存在,则通过“删除”表格中的记录来删除该记录
我知道我可以通过创建2个查询在PHP代码中处理这个问题,但我想知道我是否可以使用'if statment'或其他内容进行1次查询!!
提前致谢。
答案 0 :(得分:2)
在Oracle中,您可以将MERGE
语句与DELETE
子句一起使用,请考虑:
SQL> create table foo(userid number, pageid number, dummy number);
Table created
SQL> CREATE OR REPLACE PROCEDURE follow(p_userid NUMBER, p_pageid NUMBER) IS
2 BEGIN
3 MERGE INTO foo f
4 USING (SELECT p_userid userid, p_pageid pageid FROM dual) i
5 ON (f.userid = i.userid AND f.pageid = i.pageid)
6 WHEN MATCHED THEN
7 UPDATE SET f.dummy = NULL
8 DELETE WHERE 1 = 1
9 WHEN NOT MATCHED THEN
10 INSERT (userid, pageid) VALUES (i.userid, i.pageid);
11 END;
12 /
Procedure created
需要使用虚拟列,因为MERGE
语句无法更新连接列(在ON
子句中),并且UPDATE
子句是必需的。运行该语句两次将删除该行:
SQL> exec follow(1, 1);
PL/SQL procedure successfully completed
SQL> select * from foo;
USERID PAGEID DUMMY
---------- ---------- ----------
1 1
SQL> exec follow(1, 2);
PL/SQL procedure successfully completed
SQL> select * from foo;
USERID PAGEID DUMMY
---------- ---------- ----------
1 1
1 2
SQL> exec follow(1, 1);
PL/SQL procedure successfully completed
SQL> select * from foo;
USERID PAGEID DUMMY
---------- ---------- ----------
1 2
答案 1 :(得分:0)
据我所知,你不能直接这样做。作为一个工作场所,根据您查询的方式,您可以使用分号作为分隔符在同一个句子中启动两个查询。
当然,您总是可以使用存储过程。
但是,我不认为这种解决方案是好的做法。将您的两个查询保留在同一个事务中,并从业务层调用它。这将使我在将来更加容易。
答案 2 :(得分:-1)
假设您要添加或删除的表名为User_Page
。
IF EXISTS (SELECT * FROM User_Page WHERE USerID = @userID and PageID = @PageID)
BEGIN
DELETE FROM User_Page WHERE USerID = @userID and PageID = @PageID
END
ELSE
BEGIN
INSERT INTO User_Page (UserID, PageID) VALUES (@userID, @pageID)
END