嗨我想建立一个(关注/取消关注)按钮,
如果记录不存在,则应该通过在表中“添加”记录来跟踪页面{表列是 UserID 和 PageID} ,
或者如果记录已经存在,则通过从表中“删除”记录来取消关注页面
我知道我可以通过创建 2 个查询在 PHP 代码中处理这个问题,但我想知道我是否可以使用 'if statment' 或其他东西来处理 1 个查询!!
提前致谢。
嗨我想建立一个(关注/取消关注)按钮,
如果记录不存在,则应该通过在表中“添加”记录来跟踪页面{表列是 UserID 和 PageID} ,
或者如果记录已经存在,则通过从表中“删除”记录来取消关注页面
我知道我可以通过创建 2 个查询在 PHP 代码中处理这个问题,但我想知道我是否可以使用 'if statment' 或其他东西来处理 1 个查询!!
提前致谢。
在 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
据我所知,你不能直接这样做。作为一种解决方法,根据您启动查询的方式,您可以使用分号作为分隔符在同一个句子中启动两个查询。
当然,您总是可以使用存储过程来代替。
但是,我不认为这种解决方案是好的做法。将您的两个查询保存在同一个事务中并从业务层调用它。将来我会更加坚持。
假设您要添加或删除的表被调用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