0

我想知道在插入时 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);

你只参考values插入语句的地方,因为它们已经加载。也许有人知道如何在 dibi 中做到这一点,我还没有考虑过解决方案,因为我只在内部系统上保存了一些字节。

最大限度

4

1 回答 1

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);
于 2014-06-13T18:31:59.277 回答