php - 迪比 :query best practice on duplicate key

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

已解决:上层解决方案有效,只是更新集问题。

为了获得更好的性能: 当插入大量数据(例如 blob)时,这种方法不是最好的,因为查询字符串将获得双倍长度。最好使用引用更新方法,例如

插入表 (a,b,c) 值 (1,2,3),(4,5,6) 重复 key 更新 c=VALUES(a)+VALUES(b);

其中您仅引用插入语句中的,因为它们已经加载。 也许有人知道如何在 dibi 中执行此操作,我还没有考虑解决方案,因为我只在内部系统上保存了一些字节。

最大

最佳答案

假设您有一个像这样的数组:

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

关于php - 迪比 :query best practice on duplicate key,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17171496/

相关文章:

php - Laravel Eloquent : How to order results of related models?

php - 在执行 SQL 文件时与 MySQL 一起使用 --ignore-table

mysql - 将mysql数据库恢复到magento后重定向

php - 将一个表中的所有行插入到另一个表 + 最后的时间戳

php - 获取使用短代码的所有页面/帖子 ID

PHP 面向对象编程 - 高级技术书籍

php - 数据库 mySQL 查询使用 TIMESTAMP 从最旧到最新对最后十个值进行排序

php - 无法将 php 服务器响应转换为 html5 OpenFL haxe 应用程序

mysql - 数据库:如何创建更新级联表并查询数据?

PHP/MySQL 如何从 LEFT JOIN 中删除重复信息?