Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何在1个查询中插入和删除记录?_Mysql_Sql Server_Database_Oracle - Fatal编程技术网

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

Mysql 如何在1个查询中插入和删除记录?,mysql,sql-server,database,oracle,Mysql,Sql Server,Database,Oracle,嗨,我想建立一个(跟随/取消跟随)按钮 如果记录不存在,{table columns is UserID and PageID}应在页面后面通过“在表{table columns is UserID and PageID}中添加”记录 或者,如果记录已经存在,则通过“从表中删除该记录”来取消页面的后续操作 我知道我可以在PHP代码中通过创建2个查询来处理这个问题,但我想知道我是否可以使用“if statt”或其他方法通过1个查询来处理这个问题 提前谢谢。据我所知,你不能直接做。作为工作区,根据查

嗨,我想建立一个(跟随/取消跟随)按钮

如果记录不存在,{table columns is UserID and PageID}应在页面后面通过“在表{table columns is UserID and PageID}中添加”记录

或者,如果记录已经存在,则通过“从表中删除该记录”来取消页面的后续操作

我知道我可以在PHP代码中通过创建2个查询来处理这个问题,但我想知道我是否可以使用“if statt”或其他方法通过1个查询来处理这个问题


提前谢谢。

据我所知,你不能直接做。作为工作区,根据查询的方式,可以在同一句话中使用分号作为分隔符启动两个查询

当然,您始终可以使用存储过程


然而,我不认为这种解决方案是好的实践。将两个查询保持在同一事务中,并从业务层调用它。这将使我在将来更加容易理解。

假设您要添加到或从中删除的表名为
User\u 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

在Oracle中,可以将语句与子句一起使用,请考虑:

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
语句无法更新join列(在
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 

这是在SQL/Server和/或Oracle上实现的吗?您已经标记了。和MySQL。说真的,所有这些问题都是针对每种可能的语言/平台的吗?