Я придумал следующий запрос для 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, [чтение], [запись], [только чтение], [изменение], [админ]) ЗНАЧЕНИЯ ('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