如果行已经存在,我想要更新行的列,但如果它还没有存在,那么我想插入一个新行。
这种类型的问题一般适用于SQL
特别是SQLite
我试图通过使用SQLite.swift包装器来开发iOS来节省开发时间。我选择了这个框架,因为它是recommended on raywenderlich.com。我认为有一个更新或插入语法的例子会很有用。
在this answer中,Sam Saffron说:
如果你一般都在做更新我会......
- 开始交易
- 进行更新
- 检查rowcount
- 如果为0则执行插入
- 提交
醇>如果你一般都在做插页,我会
- 开始交易
- 尝试插入
- 检查主键违规错误
- 如果我们收到错误,请执行更新
- 提交
醇>这样就可以避免选择,并且您可以在事务上发声 源码。
这对我来说很有意义,所以在下面我的回答中,我提供的一个例子是"通常做更新"。
答案 0 :(得分:2)
在此示例中,用户词典存储在自定义键盘上键入的单词。如果单词已经在字典中,则该单词的频率计数增加1.但如果之前没有输入单词,则插入新行,默认频率为1。 / p>
该表是使用以下架构创建的:
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)
})
从问题中得出,这就是我们想要做的事情:
- 开始交易
- 进行更新
- 检查rowcount
- 如果为0则执行插入
- 提交
醇>
以下是代码的外观。
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 documentation以获取更多帮助。
答案 1 :(得分:0)
请选中此答案,这是学习如何创建表格并在其中插入行的最佳方法。