请知悉:本文最近一次更新为 3年 前,文中内容可能已经过时。

鉴于网上相关资料不多,纯研究了下怎么实现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 – 重复键更新

SQLite – UPSERT *not* INSERT or REPLACE

Performing Transactions


如您从本文得到了有价值的信息或帮助,请考虑扫描文末二维码捐赠和鼓励。

尊重他人劳动成果。转载请务必附上原文链接,我将感激不尽。


与《Yii2 SQLite 事务以及类upsert的代码实例》相关的博文:


留言

avatar
😀
😀😁😂😅😭🤭😋😘🤔😰😱🤪💪👍👎🤝🌹👌