【问题标题】:How to do IF NOT EXISTS in SQLiteSQLite中如果不存在怎么办
【发布时间】:2010-10-06 13:44:46
【问题描述】:

我正在尝试将此行从 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 或者至少我不能让它工作。 我错过了一些简单的东西吗?有解决办法吗?

【问题讨论】:

    标签: sql sqlite


    【解决方案1】:

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

    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');
    

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

    【讨论】:

      【解决方案2】:

      您还可以使用 KEY 字段在表上设置约束并将 On Conflict 设置为“忽略”

      当发生适用的约束违规时,IGNORE 解决方案 算法跳过包含约束违规的一行,并且 继续处理 SQL 语句的后续行,就像 没有出错。包含的行之前和之后的其他行 约束违规被正常插入或更新。没有错误是 使用 IGNORE 冲突解决算法时返回。

      SQLite Documentation

      【讨论】:

        【解决方案3】:

        这个怎么样?

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

        (未经测试,因为我没有 SQLite...但是 this link 具有很强的描述性。)

        此外,这也应该有效:

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

        【讨论】:

        • 谢谢。但是,应该注意的是,只有在 EventTypeName 设置为唯一时,INSERT OR IGNORE 片段才有效。
        • 是的。考虑到它在示例 SQL 中的使用方式,我认为它是独一无二的。如果不是,则应使用第二种方法。
        • EventTypeName不唯一的情况下真的可以用第二种方法吗?我正在尝试做类似的事情,我发现 SELECT WHERE NOT EXISTS 子句返回多行,实际上每一行(相当于 )EventTypeName != 'ANI Received' 都是真的。
        • 目的是让 EventTypeName 是唯一的。仅当表中不存在新值“ANI Received”时,才会将其插入表 EVENTTYPE。这就是 WHERE NOT EXISTS 的作用。SELECT WHERE NOT EXISTS 子句只能返回一行;没有 FROM 子句 - 无法返回多行。希望这能解决问题。
        • 这是非常糟糕的编码风格。在每个错误上,查询都会默默地失败!来自文档:IGNORE 当发生适用的约束违规时,IGNORE 解析算法会跳过包含约束违规的一行并继续处理 SQL 语句的后续行,就好像没有出错一样。包含违反约束的行之前和之后的其他行被正常插入或更新。使用IGNORE冲突解决算法时不返回错误。
        猜你喜欢
        • 2019-01-22
        • 1970-01-01
        • 2015-05-14
        • 1970-01-01
        • 2022-06-13
        • 2019-11-10
        • 2019-10-10
        • 2019-06-08
        • 2012-01-23
        相关资源
        最近更新 更多