Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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 SQL Server:如果找到记录,请更新或插入,合并查询错误更正_Mysql_Sql_Sql Server_Merge_Insert Update - Fatal编程技术网

Mysql SQL Server:如果找到记录,请更新或插入,合并查询错误更正

Mysql SQL Server:如果找到记录,请更新或插入,合并查询错误更正,mysql,sql,sql-server,merge,insert-update,Mysql,Sql,Sql Server,Merge,Insert Update,我为SQL Server提出了以下查询,用于在发现其他插入时更新行 merge tblpermissions as t using (select cid, uid from tblpermissions) as s on (t.cid = s.cid and t.uid=s.uid) when not matched THEN INSERT (cid, uid, [read], [write], [readonly], [modify], [admin]) VALUES ('1', '1

我为SQL Server提出了以下查询,用于在发现其他插入时更新行

merge tblpermissions  as t
using (select cid, uid from tblpermissions) as s
on (t.cid = s.cid and t.uid=s.uid)
when not matched
THEN INSERT (cid, uid, [read], [write], [readonly], [modify], [admin]) VALUES ('1',   '1', 1, 1, 0, 1, 1) 
when matched 
THEN UPDATE SET [read]=1, write=1, readonly=0, modify=1, admin=1 ;
虽然它没有抛出任何错误,但它并没有达到我的预期。表中没有记录,因此不会插入新记录

有什么更正吗

编辑:考虑到您的建议,我进一步修改如下,但没有任何预期结果-

MERGE INTO tblpermissions  as t
using (SELECT '1' AS cid, '1' AS uid FROM tblpermissions) as s
on (t.cid = s.cid and t.uid=s.uid)
WHEN NOT MATCHED 
THEN INSERT (cid, uid, [read], [write], [readonly], [modify], [admin])
VALUES  ('1', '1', 1, 1, 0, 1, 1) 
WHEN MATCHED
THEN UPDATE SET [read]=1, write=1, readonly=0, modify=1, admin=1 ;
编辑:请检查底部的评论,下面是对您的建议的改进查询,更不用说它不会像预期的那样工作,因为它再次使用相同的表

MERGE INTO tblpermissions  as t
using tblpermissions as s
on (t.cid = s.cid and t.uid=s.uid)
WHEN NOT MATCHED 
THEN INSERT (cid, uid, [read], [write], [readonly], [modify], [admin])
VALUES  ('1', '1', 1, 1, 0, 0, 1) 
WHEN MATCHED
THEN UPDATE SET [read]=1, write=1, readonly=0, modify=1, admin=1 ;
编辑:选择“如果找到”更新“否则在下面插入备选方案-

$query = "SELECT * FROM ".SQL_PREFIX."permissions\n"
              ."WHERE cid='".$cid."' AND uid='".$uid."'";
    $sth = $this->dbh->query($query);
    $res = $sth->fetch();
    //print_r($res);var_dump($res);
    if(!$res || $res==null)
    {
        $query = "INSERT INTO ".SQL_PREFIX."permissions (cid, uid, [read], [write], [readonly], [modify], [admin])\n"
            ."VALUES ('$cid', '$uid', ".implode(", ", $values).")";
        if(!($sth = $this->dbh->query($query)))
            $this->db_error(__('Error inserting user permissions.'),
                $query);
    }else{
        $query = "UPDATE ".SQL_PREFIX."permissions SET ".implode(", ", $sets).";";
        if(!($sth = $this->dbh->query($query)))
            $this->db_error(__('Error updating user permissions.'),
                $query);
    } 
编辑:下面是针对这种情况的mysql解决方案-

插入TBL权限(cid、uid、[读]、[写]、[只读], 重复键上的[修改],[管理]值('1','1',1,1,0,0,1 更新[读取]=1,写入=1,只读=0,修改=1,管理=1


它只使用关键字复制键。还要再次强调的是,cid和uid组合中存在唯一的键约束。因此,mysql所做的是,首先它只是查找我们试图插入的cid和uid的组合,如果发现更新,它就会插入新的记录。

因为源表和目标表是相同的,所以从不存在行不匹配的情况。正在更新tblpermissions上的所有行

为了插入,源表(使用定义)必须与目标表不同,例如以下示例:

merge tblpermissions  as t
using (select cid, uid from otherTable) as s
on (t.cid = s.cid and t.uid = s.uid)

merge tblpermissions  as t
using (select cid, uid from tblpermissions) as s
on (t.cid = s.cid + 1 and t.uid = s.uid + 1)
编辑:由于您使用的是常量值,而不是从任何表中选择的结果,因此以下操作可能会起到作用:

merge tblpermissions as t
using (select '1' cid, '1' uid, 1 [read], 1 [write], 0 [readonly], 0 [modify], 1 [admin]) s
on (t.cid = s.cid and t.uid = s.uid)
when matched 
    then update set [read] = s.[read], write = s.[write], readonly = s.[readonly], modify = s.[modify], admin = s.[admin]
when not matched
    then insert (cid, uid, [read], [write], [readonly], [modify], [admin]) values (s.cid, s.uid, s.[read], s.[write], s.[readonly], s.[modify], s.[admin]);
虽然我认为只插入一行合并是过分的,但执行以下操作会更容易:

if exists (select 1 from tblpermissions where cid = '1' and uid = '1')
update tblpermissions set [read] = 1, write = 1, readonly = 0, modify = 1, admin = 1 where cid = '1' and uid = '1'
else
    insert tblpermissions (cid, uid, [read], [write], [readonly], [modify], [admin]) VALUES ('1', '1', 1, 1, 0, 1, 1)

我不认为SQL Server有一种更短或更优雅的方法来执行此操作,这与MySQL中重复的
不同。

您可以通过从相同的
tblPermissions
中选择来合并到
tblPermissions
?!?!?我猜在
s
中选择的所有行都已经在
tblPermissions
中了(因为您是从那里选择的)-所以您只会在匹配
部分时得到
,显然…好吧,我明白您的意思,但我只想实现这一点-如果存在具有特定id的记录,则更新它,否则插入新记录。在这种情况下,存在cid和uid组合,然后更新它们的权限,否则请插入新的权限条目。问题是您正在将相同的cid和uid组合与其自身进行比较。例如,如果tblpermissions包含一个cid=1&uid=1的行,那么它将与cid=1&uid=1的同一行进行比较,表中的每一行也是如此。最后,不可能有一个不存在的特定id,因为您正在将相同的id与它们自己进行比较。好的,“使用(某些查询)作为s”定义源以将其与目标表进行比较。@jhacksps。事实上,它不一定是一个查询,您可以直接使用一个表,例如
在a=b上使用otherTable
。好的@Dang,谢谢您仍然表现出兴趣。上面包含了一个MySQL解决方案,并且正在尝试为同样的解决方案找出MS SQL的等价物。