【问题标题】:INSERT OR REPLACE messing with ID SQLite插入或替换 ID SQLite
【发布时间】:2015-05-11 09:50:10
【问题描述】:

我的应用程序是这样工作的,我有一个本地数据库,其中填充了来自我的 API 的数据,当我在我的 API 中插入新数据时,应用程序会检查最后修改的项目并同步它,然后在为了实现我正在使用 INSERT OR REPLACE 语句,但它弄乱了我的“faturamento_id”,它正在删除 id 并替换为新的,我希望它继续自动递增(如果可能的话)在那里是要同步的新数据。我该怎么做?

angular.forEach(item.faturamentos, function (fat) {

                        db.transaction(
                            function (tx) {

                                tx.executeSql('INSERT OR REPLACE INTO faturamento_pedidos (valor_a_faturar, ' +
                                    'nota_fiscal, ' +
                                    '_criado,' +
                                    '_modificado , ' +
                                    '_status, ' +
                                    'id_rm, ' +
                                    'cod_id, ' +
                                    'id_rm_pedido, ' +
                                    'id_rm_empresa, ' +
                                    'data, ' +
                                    'informacoes_adicionais ) VALUES (?,?,?,?,?,?,?,?,?,?,?)',

                                    [
                                        fat.valor_a_faturar,
                                        fat.nota_fiscal,
                                        fat.criado,
                                        fat.modificado,
                                        fat.status,
                                        fat.id,
                                        fat.cod_id,
                                        fat.id_rm_pedido,
                                        fat.id_rm_empresa,
                                        fat.data,
                                        fat.informacoes_adicionais


                                    ]);
                            },
                            txErrorHandler,
                            function () {
                                log('Record inserted successfully');
                            }
                        );
                    });

表格:

tx.executeSql("CREATE TABLE IF NOT EXISTS faturamento_pedidos (" +
        "faturamento_id Integer PRIMARY KEY AUTOINCREMENT, " +
        "_criado Text, " +
        "_modificado Text, " +
        "_status Text, " +
        "id_rm Integer, " +
        "id_rm_pedido Integer, " +
        "id_rm_empresa Integer, " +
        "cod_id Text, " +
        "valor_a_faturar Text, " +
        "nota_fiscal Text, " +
        "data Text, " +
        "informacoes_adicionais Text," +
        "CONSTRAINT unique_id_rm UNIQUE  ('id_rm'))");

        tx.executeSql('CREATE INDEX IF NOT EXISTS "faturamento_pedidos.index_faturamento_id" ON "faturamento_pedidos"("faturamento_id");');

【问题讨论】:

  • 根据this documentation 当一个 UNIQUE 或 PRIMARY KEY 约束违规发生时,REPLACE 算法在插入或更新当前行之前删除导致约束违规的预先存在的行,并且命令继续正常执行。 我不是 sqlite 专家,所以也许其他人可以提供帮助,但我认为你必须执行 INSERT(没有 OR REPLACE)并测试它是否由于约束而失败被侵犯,然后UPDATE 在这种情况下。

标签: sql angularjs sqlite cordova ionic-framework


【解决方案1】:

INSERT OR REPLACE 总是删除旧行(如果存在)。

但是,没有理由使用单个 SQL 语句。 只需尝试更新旧行,如果没有找到,您知道您必须插入一个新行:

tx.executeSql("UPDATE ...",
              [...],
              function(tx, result) {
                  if (result.rowsAffected == 0)
                      tx.executeSql("INSERT ...", [...]);
              });

【讨论】:

  • 问题是,如果我编辑一个项目并添加另一个项目,它不会将新项目添加到我的数据库中,因为一行已经受到影响
  • 你为每一个项目做这一切。 (如何用一条 UPDATE 语句更新两行?)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-21
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
相关资源
最近更新 更多