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ả

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
UNIQUEconstraint: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.