Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Tạo Unique Index trong SQLite Android

Unique Index là gì?

Unique Index đảm bảo không có 2 bản ghi trùng giá trị trên cột được index. Khác với PRIMARY KEY (chỉ 1 cột), có thể tạo nhiều Unique Index trên các cột khác nhau.

DatabaseHelper.java - Tạo bảng có Unique Index

@Override
public void onCreate(SQLiteDatabase db) {
    // Tạo bảng có cột email NOT NULL
    db.execSQL("CREATE TABLE " + TABLE_NAME + 
        "(id INTEGER PRIMARY KEY AUTOINCREMENT, " +
        "name TEXT, " +
        "salary BLOB, " +
        "created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, " +
        "email TEXT NOT NULL)");

    // Tạo Unique Index trên cột email
    db.execSQL("CREATE UNIQUE INDEX idx_email ON " + TABLE_NAME + "(email)");
}

Insert với xử lý trùng lặp

public boolean insert(String name, String salary) {
    SQLiteDatabase db = getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put("name", name);
    values.put("salary", salary.getBytes());
    values.put("email", "user" + System.currentTimeMillis() + "@example.com"); // Email duy nhất
    
    try {
        // INSERT OR IGNORE: bỏ qua nếu email đã tồn tại
        long result = db.insertWithOnConflict(TABLE_NAME, null, values, SQLiteDatabase.CONFLICT_IGNORE);
        return result != -1;
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}

Các chiến lược CONFLICT

  • CONFLICT_ROLLBACK: Hủy transaction, ném exception (mặc định).
  • CONFLICT_IGNORE: Bỏ qua bản ghi trùng, không báo lỗi.
  • CONFLICT_REPLACE: Xóa bản ghi cũ, chèn bản ghi mới.
  • CONFLICT_ABORT: Dừng lệnh hiện tại, giữ các thay đổi trước đó.
  • CONFLICT_FAIL: Dừng lệnh, không rollback.

Kết quả

Tạo Unique Index trong SQLite Android

Dữ liệu hiển thị kèm email duy nhất. Thử insert email trùng sẽ bị bỏ qua (CONFLICT_IGNORE) hoặc lỗi (mặc định).

Lưu ý

  • Unique Index tự động tạo khi dùng UNIQUE constraint: email TEXT UNIQUE.
  • Index giúp truy vấn WHERE email = ? nhanh hơn.
  • Không thể tạo Unique Index trên cột đã có dữ liệu trùng.