0

嗨我想建立一个(关注/取消关注)按钮,

如果记录不存在,则应该通过在表中“添加”记录来跟踪页面{表列是 UserID 和 PageID} ,

或者如果记录已经存在,则通过从表中“删除”记录来取消关注页面

我知道我可以通过创建 2 个查询在 PHP 代码中处理这个问题,但我想知道我是否可以使用 'if statment' 或其他东西来处理 1 个查询!!

提前致谢。

4

3 回答 3

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 
于 2013-02-14T09:52:41.913 回答
0

据我所知,你不能直接这样做。作为一种解决方法,根据您启动查询的方式,您可以使用分号作为分隔符在同一个句子中启动两个查询。

当然,您总是可以使用存储过程来代替。

但是,我不认为这种解决方案是好的做法。将您的两个查询保存在同一个事务中并从业务层调用它。将来我会更加坚持。

于 2013-02-14T09:47:31.360 回答
-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
于 2013-02-14T09:49:47.130 回答