如果SQLite中不存在怎么办


80

我正在尝试将此行从MS SQL Server移植到SQLite

IF NOT EXISTS(SELECT 1 FROM EVENTTYPE WHERE EventTypeName = 'ANI Received') 
    INSERT INTO EVENTTYPE (EventTypeName) VALUES ('ANI Received');

似乎SQLite不支持IF NOT EXISTS,或者至少我无法使其工作。我是否缺少简单的东西?有解决方法吗?

Answers:


120

这个怎么样?

INSERT OR IGNORE INTO EVENTTYPE (EventTypeName) VALUES 'ANI Received'

(未经测试,因为我没有SQLite ...但是此链接具有描述性。)

此外,这也应该起作用:

INSERT INTO EVENTTYPE (EventTypeName)
SELECT 'ANI Received'
WHERE NOT EXISTS (SELECT 1 FROM EVENTTYPE WHERE EventTypeName = 'ANI Received');

14
谢谢。但是,应注意,只有将EventTypeName设置为唯一时,INSERT或IGNORE块才起作用。
AngryHacker

2
真正。考虑到示例SQL中的用法,我认为它是唯一的。如果不是,则应使用第二种方法。
海滩

如果EventTypeName不是唯一的,可以真的使用第二种方法吗?我正在尝试做类似的事情,但我发现SELECT WHERE NOT EXISTS子句返回多行,实际上每一行(等于EventTypeName!='ANI Received')为真。
2013年

目的是使EventTypeName唯一。如果表EVENTTYPE中不存在新值,则仅将其插入到表EVENTTYPE中。这就是WHERE NOT EXISTS的内容。SELECT WHERE NOT EXISTS子句只能返回单行;没有FROM子句-无法返回多行。希望这可以解决。
海滩

1
这是非常糟糕的编码风格。对于每个错误,查询都将自动失败!来自文档:IGNORE当发生适用的约束违例时,IGNORE解析算法会跳过包含约束违例的一行,并继续处理SQL语句的后续行,就好像什么都没出错。包含约束违例的行之前和之后的其他行将正常插入或更新。使用IGNORE冲突解决算法时,不会返回任何错误。
ManuelSchneid3r

12

如果要忽略现有值的插入,则表中必须有一个键字段。只需使用主键字段创建一个表,例如:

CREATE TABLE IF NOT EXISTS TblUsers (UserId INTEGER PRIMARY KEY, UserName varchar(100), ContactName varchar(100),Password varchar(100));

然后在表上插入或替换/插入或忽略查询,例如:

INSERT OR REPLACE INTO TblUsers (UserId, UserName, ContactName ,Password) VALUES('1','UserName','ContactName','Password');

它不会让它重新输入现有的主键值...这是您可以检查表中是否存在值的方法。


1

您还可以使用KEY字段在表上设置约束,并在冲突时设置“忽略”

当发生适用的约束违例时,IGNORE解析算法将跳过包含约束违例的一行,并继续处理SQL语句的后续行,就好像什么都没出错。包含约束违例的行之前和之后的其他行将正常插入或更新。使用IGNORE冲突解决算法时,不会返回任何错误。

SQLite文档

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.