我想知道插入时dibi的最佳做法是什么,如果存在则更新特定行。
编辑,截断我的帖子以获得更好的可读性:
发现错误,现在不是ON DUPLICATE KEY UPDATE SET ..
而是ON DUPLICATE KEY UPDATE ..
,但仍然没有更新值!?
dibi::query("INSERT INTO table %v", $qdata, 'ON DUPLICATE KEY UPDATE %a', $qdata);
已解决:上层解决方案有效,只是UPDATE SET问题。
为了获得更好的效果: 当插入大量数据(如blob)时,这种方法并不是最好的,因为查询字符串将获得双倍的长度。更好地使用像
这样的引用更新方法 INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
您只从insert语句引用values
,因为它们已经加载。
也许有人知道如何在dibi中这样做,我还没有想过解决方案,因为我只在内部系统上保存了一些字节。
最高
答案 0 :(得分:1)
假设您有一个这样的数组:
array(
0 => array(
'id' => 1,
'name' => 'John',
'surname' => 'Doe'
),
1 => array(
'id' = 2,
'name' => 'Jake',
'surname' => 'First'
)
)
你想得到这个问题:
INSERT INTO table (`id`,`name`,`surname`) VALUES (1,'John','Doe'),(2,'Joe','First')
ON DUPLICATE KEY UPDATE `name`=VALUES(name), `surname`=VALUES(surname);
为了做到这一点,你必须从初始数组中收集密钥并将它们放在一个新的数组中,包含在' VALUES'
// search for columns
$keys = array_keys($array[0]);
// wrap keys
$updateStatement = array();
foreach ($keys as $key) {
if ($key != 'id') $updateStatement[$key] = "VALUES($key)";
}
dibi::query("INSERT INTO table %ex", $data, 'ON DUPLICATE KEY UPDATE %a', $updateStatement);