Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何不在sqlite中的列中插入公共数据?_Sql_Sqlite - Fatal编程技术网

如何不在sqlite中的列中插入公共数据?

如何不在sqlite中的列中插入公共数据?,sql,sqlite,Sql,Sqlite,我有一个名为category的表,该表如下所示 cat_id cat_name 1 Science 2 Arts item_id item_name cat_id 1 physics 1 2 literature 2 3 chemistry 1 另一个名为item的表 cat_id cat_name 1 Science 2 Arts item

我有一个名为
category
的表,该表如下所示

cat_id    cat_name
1          Science
2          Arts
item_id  item_name  cat_id
1          physics    1
2          literature 2
3          chemistry  1
另一个名为
item
的表

cat_id    cat_name
1          Science
2          Arts
item_id  item_name  cat_id
1          physics    1
2          literature 2
3          chemistry  1
请将
cat_id
标记为
表的外键

现在我想,如果我把
math
作为
item\u name
放在
Arts
类别下,那么它将成功插入,但我希望这样做,如果我想再次插入相同的数据,那么它将不会插入。还请标记我只有cat_名称和item_名称,然后我的查询使用
cat_名称
从category表获取category_id,并以这种方式插入item表

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

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

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

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

根据这一回答:

您可以使用
INSERT或IGNORE
语句。

SQLite没有“INSERT或UPDATE”,这将非常适合您的情况

但您可以用“INSERT或REPLACE”(SQLite支持)和“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)与一个SELECT连接起来,该SELECT生成一个具有空item_id的新记录

诀窍是最后的“ORDER BY item_id DESC LIMIT 1”,其中INSERT语句的实际结果正好是1条记录:一条存在的记录,具有相同的item_id和“new_category”,或者一条具有空item_id的新记录,这迫使SQLite为您创建一条记录


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

您可以在插入之前检查数据库,或者将列
item\u name
设置为MySQL中唯一的,这将抛出一个错误。这是MySQL还是SQLite?SQLite数据库更适合更新我的查询,请重新检查