0

我有一个名为category的表,该表看起来像

cat_id    cat_name
1          Science
2          Arts

另一个名为item的表看起来像

item_id  item_name  cat_id
1          physics    1
2          literature 2
3          chemistry  1

请在此处标记cat_iditem表的外键。

现在我想要如果我把mathitem_name放在Arts类别下,那么它会成功插入,但我希望这种情况发生,如果我想再次放置相同的数据,那么它不会插入。还请标记我只有 cat_name 和 item_name 然后我的查询使用cat_name从类别表中获取 category_id 并以这种方式插入到项目表中

insert into item (item_name,cat_id) select 'math',category.cat_id from category where category.cat_name = 'Arts' 

但是如果我再次运行此查询,它会再次插入相同的项目math,但我想阻止这种情况发生,我该怎么办?

4

2 回答 2

1

Reyjohn,您不能将列定义为唯一的吗?这将防止重复值。

我不使用 sqlite,但我的印象是它使用与 MySQL 类似的语法,但没有一些更严格的检查。

根据这个答案: sqlite - How to get INSERT OR IGNORE to work

你可以使用INSERT OR IGNORE声明。

于 2013-08-27T22:54:36.293 回答
0

SQLite 没有非常适合您的情况的“插入或更新”。

但是您可以使用 SQLite 支持的“INSERT OR REPLACE”以及“UNION”来模拟它。我开发这种技术是因为我想发出一个查询并让 SQLite 引擎做所有事情。

INSERT OR REPLACE INTO item (item_id, item_name, cat_id)
    SELECT item_id, item_name, cat_id FROM (

       SELECT item_id, item_name, 'new_category' FROM item
       WHERE item_name='math'

       UNION

       SELECT NULL, 'math', 'new_category'

    ) ORDER BY item_id DESC LIMIT 1;

因此,您基本上是在制作一个“SELECT WHERE item_name='math'”来获取现有记录(如果它存在),然后将此结果(UNION)与生成具有 NULL item_id 的新记录的 SELECT 连接。

然后诀窍是最后的“ORDER BY item_id DESC LIMIT 1”,其中 INSERT 语句的实际结果恰好是 1 条记录:存在的一条记录,具有相同的 item_id 和“new_category”或带有 NULL 的新记录item_id,它强制 SQLite 为您创建一个。

您还可以检查之前是否存在记录(使用 SELECT)并决定是否需要 INSERT 或 UPDATE。但这会在客户端导致 2 个查询和附加代码。这就是我开发上述技术的原因。

于 2013-08-27T23:01:15.697 回答