【问题标题】:ANDROID STUDIO / SQLiteLog: (1) near "LIMIT": syntax errorANDROID STUDIO / SQLiteLog:(1)“LIMIT”附近:语法错误
【发布时间】:2020-09-11 16:28:38
【问题描述】:

我正在尝试使用带有 LIMIT 1 的 SQL 的 DELETE 函数删除我在数据库中获取的重复项,但它向我显示“LIMIT”语法错误。

        myDatabase.execSQL("CREATE TABLE IF NOT EXISTS users (name VARCHAR , age INT(3))");

        myDatabase.execSQL("INSERT INTO users (name, age) VALUES ('Vaishant', 21)");

        myDatabase.execSQL("INSERT INTO users (name, age) VALUES ('Tommy',4)");

        myDatabase.execSQL("DELETE FROM users WHERE name = 'Vaishant' LIMIT 1");

谁能告诉我为什么会出现这个错误以及如何纠正它?

【问题讨论】:

    标签: java android sqlite android-studio android-sqlite


    【解决方案1】:

    SQLite 不支持在 DELETE 语句中使用 LIMIT
    使用返回包含您搜索的名称的行的rowid 的子查询:

    String sql = "DELETE FROM users WHERE rowid = (SELECT rowid FROM users WHERE name = 'Vaishant' LIMIT 1)";
    myDatabase.execSQL(sql);
    

    如果你想删除重复的名字只保留1,那么你可以这样做:

    DELETE FROM users
    WHERE NOT EXISTS (SELECT 1 FROM users u WHERE u.name = users.name AND u.rowid < users.rowid)
    

    或:

    DELETE FROM users
    WHERE rowid NOT IN (SELECT MIN(rowid) FROM users GROUP BY name)
    

    【讨论】:

      【解决方案2】:

      在您的删除语句中,您将限制与删除查询一起使用。您应该按如下方式使用它:

      1. 首先在表中添加 id 列作为主键

        myDatabase.execSQL("CREATE TABLE IF NOT EXISTS users (ID INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR , age INT(3))");
        
      2. 如下修改删除查询

        myDatabase.execSQL("DELETE FROM users 
        WHERE id IN 
        (SELECT id FROM 
        (SELECT id, 
        ROW_NUMBER() OVER (PARTITION BY name ORDER BY name) AS row_num FROM users )t 
        WHERE row_num > 1)");
        

      【讨论】:

        猜你喜欢
        • 2016-06-22
        • 2019-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多