【问题标题】:INSERT ... ON DUPLICATE KEY UPDATE - don't update specific field?INSERT ... ON DUPLICATE KEY UPDATE - 不更新特定字段?
【发布时间】:2013-10-23 11:41:32
【问题描述】:

我正在使用 MySQL 查询来插入或更新记录(如果已存在)。

问题是,我不想更新我的 'created' 日期时间字段。

我的活动数据:

$event = [
    'userId'        => $this->userId,
    'googleEventId' => $googleEventId,
    'isAppointment' => $isAppointment,
    'eventTitle'       => $title,
    'eventLocation'    => $location,
    'eventDescription' => $description,
    'eventStart'    => $start,
    'eventEnd'      => $end,
    'created'       => date('Y-m-d H:i:s'), // This field should be ignored when updating
    'updated'       => date('Y-m-d H:i:s')
];

我正在使用此函数插入​​或插入更新重复键($update 参数):

public function insert($table, $data, $update = 0)
{
    ksort($data);

    $fieldNames  = implode(', ', array_keys($data));
    $fieldValues = ':' . implode(', :', array_keys($data));

    $updateOnDuplicate = '';

    if ($update)
    {
        $updateOnDuplicate = ' ON DUPLICATE KEY UPDATE ';

        foreach ($data as $key=> $value) {
            $updateOnDuplicate .= "$key=:$key,";
        }
        $updateOnDuplicate = rtrim($updateOnDuplicate, ',');
    }

    $stmt = $this->prepare("INSERT INTO $table ($fieldNames) VALUES ($fieldValues) $updateOnDuplicate");

    foreach ($data as $key => $value)
    {
        $stmt->bindValue(":$key", $value);
    }

    $stmt->execute();

    return $stmt->rowCount();
}

我想我需要以某种方式检测此函数中的'created' 字段。

【问题讨论】:

  • 获取已经存储的信息,然后将该值作为更新值放入
  • 您尝试插入的表中的键是什么,您当前拥有的 INSERT 语句是什么?
  • unset($event[$created]) 更新?你是如何强迫你的查询..我们无法猜测只看到 1 个数组..显示查询方式
  • 对不起,请参阅我的编辑以了解我使用的插入/更新功能。
  • 应该可以,当您循环遍历要为 ODKU 更新的字段时,只需跳过“创建”字段,例如if ($key!='created') { $updateOnDuplicate .= "$key=:$key,";}

标签: php mysql


【解决方案1】:

if($key!='created'){}声明就是解决办法,

public function insert($table, $data, $update = 0)
{
    ksort($data);

    $fieldNames  = implode(', ', array_keys($data));
    $fieldValues = ':' . implode(', :', array_keys($data));

    $updateOnDuplicate = '';

    if ($update)
    {
        $updateOnDuplicate = ' ON DUPLICATE KEY UPDATE ';

        foreach ($data as $key=> $value) {
            if($key!='created'){ // Here you can do what you want
            $updateOnDuplicate .= "$key=:$key,"; 
            } // Here you can do what you want
        }
        $updateOnDuplicate = rtrim($updateOnDuplicate, ',');
    }

    $stmt = $this->prepare("INSERT INTO $table ($fieldNames) VALUES ($fieldValues) $updateOnDuplicate");

    foreach ($data as $key => $value)
    {
        $stmt->bindValue(":$key", $value);
    }

    $stmt->execute();

    return $stmt->rowCount();
}

现在,您可以运行此修复代码。祝你好运

【讨论】:

    猜你喜欢
    • 2010-10-07
    • 1970-01-01
    • 2013-10-03
    • 1970-01-01
    • 2015-07-30
    • 2011-01-29
    • 1970-01-01
    • 2017-04-24
    • 2011-08-09
    相关资源
    最近更新 更多