如何在1个查询中插入和删除记录?

时间:2013-02-14 09:41:52

标签: mysql sql-server database oracle

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

如果记录不存在,应该通过“添加”表格 {table columns is UserID and PageID} 来关注页面,

或者如果记录已经存在,则通过“删除”表格中的记录来删除该记录

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

提前致谢。

3 个答案:

答案 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