首页 > 解决方案 > 如何在反应原生sqlite数据库中使用upsert

问题描述

我在本机 SQLite 中有一个表,其中包含 2 列 app_name,key

我想更新一个值,如果它存在基于 app_name 否则插入新数据我尝试了以下

 db.transaction(function (tx) {
              tx.executeSql(
                'Insert or Ignore Into client_registration (app_name, key) values(?,?); UPDATE client_registration SET app_name=?, key=? where changes() = 0 and "app_name" = ?;',
                ['coin', 123],
                (tx, results) => {
                  if (results.rowsAffected > 0) {
                   console.log('success')
                    );
                  } else console.log('Registration Failed');
                },
              );
            }); 

我无法得到任何输出。

标签: react-nativesqliteandroid-sqlitereact-native-androidreact-native-ios

解决方案


SQLite 支持UPSERT以下ON CONFLICT子句:

INSERT INTO client_registration(app_name, key) VALUES (?, ?)
ON CONFLICT(app_name) DO UPDATE
SET key = EXCLUDED.key;

我假设app_name表中定义了一个唯一的约束。

您必须检查您的 android API 级别使用的 SQLite 版本,因为UPSERT在 3.24.0 版本中引入

如果不使用,UPSERT您将不得不按以下顺序执行 2 条语句:

UPDATE client_registration 
SET key=? 
WHERE app_name = ?;

INSERT OR IGNORE INTO client_registration(app_name, key) VALUES (?, ?);

推荐阅读