如何不在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数据库更适合更新我的查询,请重新检查