在SQLite插入时检查重复项

6 投票
3 回答
7088 浏览
提问于 2025-04-16 01: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

我是不是做错了什么?

谢谢你的帮助。

3 个回答

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

你可以用这个来代替 INSERT OR FAIL。

2

你遇到语法错误是因为这不是< a href="http://www.sqlite.org/lang_insert.html" rel="nofollow noreferrer">允许的语法。根据你的例子,我猜测你的数据库结构可能是这样的:

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

在这种情况下,primary key意味着unique。不过,因为你允许自动生成uid,所以你并不在乎它的值是什么,你只是不想要重复的label,所以你需要确保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这些名字不是为了这个问题而举的例子,那么你应该使用更有意义的名字,因为这些名字实在是太不直观了。

2

我很确定 INSERT 语句是没有 WHERE 条件的(文档里没有提到)。你可以做的事情有:

  • LABEL 上创建一个唯一索引
  • 使用 INSERT OR FAIL 语句
  • 如果这导致了错误,那说明这行数据已经存在了。

撰写回答