在 SQLite 中插入时检查重复项

发布于 2024-09-10 10:57:21 字数 321 浏览 6 评论 0 原文

我正在尝试使用 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”:语法错误错误。

我做错了什么吗?

感谢您的帮助。

I am trying to insert a data into SQLite database using Python.

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

This query is dynamically generated from Python and I am checking whether the date is already exist in the table before inserting and its not working in SQLite database.
Getting this near "WHERE": syntax error error.

Am I doing something wrong ?

Thanks for your help.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

泪冰清 2024-09-17 10:57:21

我很确定 INSERT 没有 WHERE 子句 (文档没有提及任何内容)。您可以做什么:

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

I'm pretty sure that INSERT doesn't have a WHERE clause (the documentation doesn't mention any). What you can do:

  • create a unique index on LABEL
  • use INSERT OR FAIL
  • if that triggers an error, the row already exists.
小草泠泠 2024-09-17 10:57:21

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

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

在这种情况下,主键意味着唯一。但是,由于您允许自动生成 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 不是用于此问题的示例名称,那么您应该使用更有意义的名称,因为这些名称的信息量非常小。

It is giving you a syntax error because it is not allowed syntax. From your example I presume the schema is probably:

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

in which case primary key implies unique. But, since you allow auto-generation of uid then you don't care what it's value is, you just don't want duplicate labels in which case you actually care that label be unique so tell it so:

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

which then works as expected:

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

Incidentally, if the names data_table, uid, and label aren't example names for the purposes of this question then you should use more meaningful names as these are horribly uninformative.

铃予 2024-09-17 10:57:21
INSERT INTO DATA_TABLE(UID,LABEL) VALUES (NULL, "UK")  
WHERE NOT EXISTS(SELECT 1 FROM DATA_TABLE WHERE LABEL="UK");

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

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

you can use this instead of INSERT OR FAIL.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文