【问题标题】:Sqlite: Insert if not exist, Update if existSqlite:如果不存在则插入,如果存在则更新
【发布时间】:2015-03-31 09:59:27
【问题描述】:

我有一个包含 2 个这样的表的数据库:

cg_resp
id  | name   | email
1   | George | george@yahoo.com

id 列是 primary_key,autoincrementednameunique

equip_info
id  | description  | cg_resp_id 
1   | Caliper      | 1

在申请表中,我有 2 个编辑框,分别命名为 edit_resp_nameedit_resp_email

如果用户使用电子邮件john@yahoo.com 插入一个新的负责人姓名,例如John,那么在保存表单期间我想insert 一个新负责人到cg_resp 表中,获取最后插入的id 和将其更新为equip_info.cg_resp_id

如果用户保持名称George,但它正在更新电子邮件,如george01@gmail.com,那么我想update id = 1 来自cg_resp 与新的电子邮件地址和其余的( equip_info.cg_resp_idcg_resp.id) 保持不变。

如果负责人的名字相同,我想保留表equip_infocg_resp_id的原始引用,所以必须避免出现删除和插入新的情况。

如何在一个Sqlite sql 序列中完成此操作?

【问题讨论】:

  • 绝对有必要在一条sql语句中做到这一点吗?您可以尝试 select 数据库中的名称。如果结果集为空,则使用insert 语句,如果该集包含您调用update 语句的名称。
  • 这不是绝对必要的......如果可能的话,我会做经典的。
  • 更新 cg_resp WHERE id=1
  • 你可以使用INSERT OR REPLACE INTO ...
  • 这能回答你的问题吗? SQLite UPSERT / UPDATE OR INSERT

标签: sql sqlite


【解决方案1】:

SQLite 没有不会删除现有行的内置机制。

最简单的方法是将逻辑放入您的应用程序中:

cursor = db.execute("SELECT ...")
if cursor.empty:
    db.execute("INSERT ...")
else:
    db.execute("UPDATE ...")

如果您的语言允许读取受影响的行数,则可以使用两个 SQL 命令来执行此操作:

db.execute("UPDATE ...")
if db.rowcount == 0:
    db.execute("INSERT ...")

【讨论】:

    【解决方案2】:

    使用INSERT OR REPLACE,它完全符合您的要求:当名称不存在时插入新行,否则更新。

    【讨论】:

    • REPLACE 删除旧行(如果存在)。
    • 小心,INSERT OR REPLACE 会删除该行并使用新密钥插入一个新行,因此如果您有自动生成的密钥并利用它们,那么您将不走运。我还没有找到一种优雅的方式来完成您的要求,但会继续寻找。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    • 2014-11-29
    • 2019-10-17
    • 2012-12-13
    • 2012-12-17
    相关资源
    最近更新 更多