鉴于网上相关资料不多,纯研究了下怎么实现SQLite的upsert的功能。
最终,查到利用冲突的类似的代码:
INSERT OR IGNORE INTO visits VALUES ($ip, 0);
UPDATE visits SET hits = hits + 1 WHERE ip LIKE $ip;
要求其中的ip对应的字段具有UNIQUE(或PRIMARY KEY)约束。
仔细看了下SQLite官方的介绍,发现只有命令行支持类似功能的代码:
CREATE TABLE vocabulary(word TEXT PRIMARY KEY, count INT DEFAULT 1);
INSERT INTO vocabulary(word) VALUES('jovial')
ON CONFLICT(word) DO UPDATE SET count=count+1;
回到主题,事务的功能就不用解释了吧?直接放上示例代码:
$sqlite = Yii::$app->test;
$num = 0;
$transaction = $sqlite->beginTransaction();
$beginTime = Tools::getCurrentTime();
for ($i = 1;$i <= 20000;$i++ ) {
$sqlite->createCommand()->setRawSql("INSERT OR IGNORE INTO test VALUES ('test_{$i}', 0);UPDATE test SET _cn = _cn + 1 WHERE _m='test_{$i}';")->execute();
$num++;
if ($num==1000) {
$transaction->commit();
$transaction = $sqlite->beginTransaction();
$num = 0;
}
}
if ($num>0) {
$transaction->commit();
}
参考资料
SQLite – UPSERT *not* INSERT or REPLACE
如您从本文得到了有价值的信息或帮助,请考虑扫描文末二维码捐赠和鼓励。
如本文对您有用,捐赠和留言 将是对我最好的支持~(捐赠可转为站内积分)
如愿意,请向朋友推荐本站,谢谢。
尊重他人劳动成果。转载请务必附上原文链接,我将感激不尽。