Измислих следната заявка за 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 решението за тази ситуация -
ВМЪКНЕТЕ в tblpermissions (cid, uid, [read], [write], [readonly], [modify], [admin]) СТОЙНОСТИ ('1', '1', 1, 1, 0, 0, 1) НА ДУБЛИКАТ КЛЮЧОВА АКТУАЛИЗАЦИЯ [четене]=1, запис=1, само за четене=0, модифициране=1, администратор=1
който просто използва ключовата дума DUPLICATE KEY. Също така бих искал отново да подчертая, че има уникално ключово ограничение за комбинацията cid & uid. И така, това, което mysql прави, е, че първо просто търси комбинацията от cid & uid, която се опитваме да вмъкнем, ако намери актуализации, иначе вмъква нов запис.
tblPermissions
, като избирате от същотоtblPermissions
?!?!? Предполагам, че всички редове, избрани вs
, вече ще бъдат вtblPermissions
(тъй като сте ги избрали от там) - така че очевидно ще получите само часттаwhen matched
. ... - person marc_s   schedule 09.05.2013