【问题标题】:Checking duplicate while inserting in SQLite在 SQLite 中插入时检查重复项
【发布时间】:2010-07-19 14:09:31
【问题描述】:

我正在尝试使用 Python 将数据插入 SQLite 数据库。

INSERT INTO DATA_TABLE(UID,LABEL) VALUES (NULL, "UK")  
    WHERE "UK" NOT EXISTS IN (SELECT LABEL FROM DATA_TABLE);

这个查询是从 Python 动态生成的,我在插入之前检查日期是否已经存在于表中,并且它在 SQLite 数据库中不起作用。 收到此near "WHERE": syntax error 错误。

我做错了吗?

感谢您的帮助。

【问题讨论】:

    标签: python windows sqlite pysqlite


    【解决方案1】:

    我很确定 INSERT 没有 WHERE 子句 (the documentation doesn't mention any)。你可以做什么:

    • LABEL上创建唯一索引
    • 使用INSERT OR FAIL
    • 如果触发错误,则该行已经存在。

    【讨论】:

    • 是的,我没有意识到这一点。谢谢:)
    【解决方案2】:

    它给你一个语法错误,因为它不是allowed syntax。从您的示例中,我认为架构可能是:

    create table data_table (uid integer primary key autoincrement.
         label string);
    

    在这种情况下,primary key 意味着 unique。但是,由于您允许自动生成 uid,那么您并不关心它的价值是什么,您只是不希望重复的 labels 在这种情况下您实际上关心 label 是唯一的,所以告诉它:

    create table data_table (uid integer primary key autoincrement,
         label string unique on conflict fail);
    

    然后按预期工作:

    sqlite> insert into data_table (label) values ("uk");
    sqlite> insert into data_table (label) values ("uk");
    Error: column label is not unique
    sqlite> select * from data_table;
    1|uk
    

    顺便说一句,如果名称 data_tableuidlabel 不是此问题的示例名称,那么您应该使用更有意义的名称,因为这些名称非常不具信息性。

    【讨论】:

    • 谢谢@msw,这是真的。名称只是示例,我将标签用作唯一名称。
    【解决方案3】:
    INSERT INTO DATA_TABLE(UID,LABEL) VALUES (NULL, "UK")  
    WHERE NOT EXISTS(SELECT 1 FROM DATA_TABLE WHERE LABEL="UK");
    

    您可以使用它来代替 INSERT OR FAIL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-04
      • 1970-01-01
      • 2011-02-03
      • 1970-01-01
      • 2021-01-20
      • 1970-01-01
      相关资源
      最近更新 更多