7

如果该行已经存在,我想更新该行的列,但如果它还不存在,那么我想插入一个新行。

相关问题

这种类型的问题在一般 SQL 中很流行

尤其是 SQLite

寻找 SQLite.swift 实现

我试图通过使用SQLite.swift包装器进行 iOS 开发来节省开发时间。我选择了这个框架,因为它在 raywenderlich.com 上被推荐。我认为有一个更新或插入的语法示例会很有用。

战略

这个答案中,Sam Saffron 说:

如果您通常进行更新,我会..

  1. 开始交易
  2. 进行更新
  3. 检查行数
  4. 如果为 0 则插入
  5. 犯罪

如果您通常进行插入,我会

  1. 开始交易
  2. 尝试插入
  3. 检查主键违规错误
  4. 如果我们遇到错误,请进行更新
  5. 犯罪

这样你就可以避免选择,并且你在 Sqlite 上的事务是健全的。

这对我来说很有意义,因此在下面的回答中,我提供了一个“通常进行更新”的示例。

4

2 回答 2

4

在此示例中,用户词典存储在自定义键盘上键入的单词。如果该词已在字典中,则该词的频率计数增加 1。但如果该词之前未输入过,则插入一个新行,默认频率为 1。

该表是使用以下架构创建的:

let userDictionary = Table("user_dictionary")
let wordId = Expression<Int64>("id")
let word = Expression<String>("word")
let frequency = Expression<Int64>("frequency")        

// ...

let _ = try db.run( userDictionary.create(ifNotExists: true) {t in
    t.column(wordId, primaryKey: true)
    t.column(word, unique: true)
    t.column(frequency, defaultValue: 1)
    })

从这个问题来看,这就是我们想要做的:

  1. 开始交易
  2. 进行更新
  3. 检查行数
  4. 如果为 0 则插入
  5. 犯罪

这是代码的外观。

let wordToUpdate = "hello"

// ...

// 1. wrap everything in a transaction
try db.transaction {

    // scope the update statement (any row in the word column that equals "hello")
    let filteredTable = userDictionary.filter(word == wordToUpdate)

    // 2. try to update
    if try db.run(filteredTable.update(frequency += 1)) > 0 { // 3. check the rowcount

        print("updated word frequency")

    } else { // update returned 0 because there was no match

        // 4. insert the word
        let rowid = try db.run(userDictionary.insert(word <- wordToUpdate))
        print("inserted id: \(rowid)")
    }
} // 5. if successful, transaction is commited

有关更多帮助,请参阅SQLite.swift 文档

于 2016-04-22T09:48:21.213 回答
-1

请查看此答案,这是了解如何创建表格并在其中插入行的最佳方法。

https://stackoverflow.com/a/28642293/5247430

于 2020-07-01T12:11:50.617 回答