dibi:查询重复键的最佳实践

时间:2013-06-18 14:26:25

标签: php mysql

我想知道插入时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中这样做,我还没有想过解决方案,因为我只在内部系统上保存了一些字节。

最高

1 个答案:

答案 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);