php dibi:查询重复键的最佳实践[已关闭]

mzmfm0qo  于 2023-10-15  发布在  PHP
关注(0)|答案(2)|浏览(126)

已关闭,此问题为opinion-based。它目前不接受回答。
**想改善这个问题吗?**更新问题,以便editing this post可以用事实和引用来回答。

关闭7天前。
Improve this question
我想知道什么是最好的做法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中做到这一点,我还没有想到解决方案,因为我保存只有一些字节的内部系统。
Max

mzsu5hc0

mzsu5hc01#

假设你有一个这样的数组:

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

为了做到这一点,你必须从初始数组中收集键,并将它们放在一个新数组中, Package 在'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);
i2loujxw

i2loujxw2#

另一种可能的解决方案是使用Dibi fluent interface

// Dibi\Connection
$connection->insert('table_name', [
            'key' => 1,
        ])->on('duplicate key')
        ->update('[key] = [key] + 1')
        ->execute();

相关问题