You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在CakePHP中强制执行插入操作(适配MySQL ARCHIVE引擎表)

嘿,我之前也碰到过CakePHP和MySQL ARCHIVE引擎的这个适配问题,刚好能帮到你!

问题回顾

我有一个基于MySQL ARCHIVE引擎的histories表,结构如下:

CREATE TABLE `histories` (
  `uid` int(10) unsigned NOT NULL,
  `type` varchar(255) NOT NULL,
  `param` int(11) NOT NULL,
  `param2` varchar(255) NOT NULL,
  `time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=ARCHIVE DEFAULT CHARSET=latin1;

这个表完全不需要自增ID列,结构和引擎都满足需求。但用CakePHP的常规保存代码时:

$this->History->create();
$this->History->save(['uid' => uid, 'type' => 'deleted_entry', 'param' => $thing_id]);

CakePHP会强制执行更新操作——这不仅不是我想要的,而且ARCHIVE引擎本身就不支持更新操作。查了下原因,是CakePHP自动把uid识别成了主键,所以默认走更新逻辑,又找不到强制插入的标识。另外我不想用$this->Model->query()直接写原生SQL。

完美解决方案

只需要在History模型里把$primaryKey设为null,之后调用$this->create()就能正常执行插入操作了:

class History extends AppModel {
    public $primaryKey = null;
}

如果后续有特殊场景需要执行更新操作,也很简单,只需要在调用save()之前临时指定主键即可:

$this->History->primaryKey = 'uid';

内容的提问来源于stack exchange,提问作者Vael Victus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:47:17