SQLite:防止重复

Posted

技术标签:

【中文标题】SQLite:防止重复【英文标题】:SQLite: prevent duplicates 【发布时间】:2010-11-09 11:03:47 【问题描述】:

我想创建一个表来存储设备设置。该表共有三行:id、parameter_name 和 parameter_value。

该表是通过执行以下查询语句创建的:

DATABASE_CREATE = "create table DATABASE_TABLE (KEY_ID INTEGER PRIMARY KEY AUTOINCREMENT, KEY_NAME INTEGER not null, VALUE TEXT not null);

然后通过执行以下方法存储行:

private long insertRow(int rowParameter, String rowValue, SQLiteDatabase db)
    long res = -1;
    ContentValues settingsParameterValues = new ContentValues();
    settingsParameterValues.put(KEY_NAME, rowParameter);
    settingsParameterValues.put(VALUE, rowValue);
    if(db != null)
        res = db.insert(DATABASE_TABLE, null, settingsParameterValues);
    
    return res;

创建数据库时会存储默认值:

@Override
    public void onCreate(SQLiteDatabase db) 
        db.execSQL(DATABASE_CREATE);
        insertRow(PRIVACY_LEVEL_ROW_INDEX, "0", db);
        insertRow(STREAM_TITLE_ROW_INDEX, "untitled", db);
        insertRow(STREAM_TAGS_ROW_INDEX, "", db);
    

insertRow() 方法的问题在于它无法防止重复条目。

有谁知道在这种情况下如何防止重复条目?

【问题讨论】:

【参考方案1】:

You can use the column constraint UNIQUE.

UNIQUE 约束导致在指定列上创建唯一索引。

【讨论】:

【参考方案2】:

我会在数据库表定义中创建一个 UNIQUE CONSTRAINT。这将自动防止重复条目,这几乎是唯一的并发安全方式!

此外,不要忘记 CHECK CONSTRAINT,如果您需要为表中的数据定义更复杂的规则,它可能会更有帮助。

【讨论】:

【参考方案3】:

您是试图通过代码还是在数据库中阻止它?

如果试图阻止代码,您需要执行 SELECT 并查看该行是否已存在。

如果试图阻止它进入数据库,您需要在您不想允许重复的任何行上添加一个 UNIQUE 约束。

【讨论】:

【参考方案4】:

在您的情况下,正确的主键应该是 parameter_name

【讨论】:

以上是关于SQLite:防止重复的主要内容,如果未能解决你的问题,请参考以下文章

从 JSONArray 插入/更新 +10000 行到 SqLite 时如何防止应用程序崩溃

防止自动递增整数主键?

防止SQLite Magellan破坏您的应用程序

防止SQLite Magellan破坏您的应用程序

防止SQLite Magellan破坏您的应用程序

Python Flask SQLalchemy sqlite3 防止数据库搜索中的 SQL 注入