webentwicklung-frage-antwort-db.com.de

hinzufügen einer eindeutigen Einschränkung in der Raumdatenbank zu mehreren Spalten

Ich habe eine Entität im Raum

@Entity(foreignKeys ={
        @ForeignKey(entity = Label.class, parentColumns = "_id", childColumns = "labelId", onDelete = CASCADE),
        @ForeignKey(entity = Task.class, parentColumns = "_id", childColumns = "taskId", onDelete = CASCADE)
})
public class LabelOfTask extends Data{
    @ColumnInfo(name = "labelId")
    private Integer labelId;
    @ColumnInfo(name = "taskId")
    private Integer taskId;
}

die SQL-Syntax dieser Entität lautet wie folgt

CREATE TABLE `LabelOfTask` (
    `_id` INTEGER PRIMARY KEY AUTOINCREMENT,
     `labelId` INTEGER,
     `taskId` INTEGER,
     FOREIGN KEY(`labelId`) REFERENCES `Label`(`_id`) ON UPDATE NO ACTION ON DELETE CASCADE ,
     FOREIGN KEY(`taskId`) REFERENCES `Task`(`_id`) ON UPDATE NO ACTION ON DELETE CASCADE
 );

aber welche Änderung oder Anmerkung muss ich in der Entitätsklasse hinzufügen, wenn ich die Einschränkung an das automatisch erzeugte SQL-Schema der Tabelle anhängen möchte

unique (labelId, taskId)

Letztendlich möchte ich die Kombination von labelId und taskId in einer Tabelle (oder Entität eines Raums) mithilfe der Raumbibliothek eindeutig machen.

7
Kevan

Eine einfache UNIQUE-Einschränkung für eine Spalte wird nicht über einen Index unterstützt.

Sie können diese Eindeutigkeitseigenschaft erzwingen, indem Sie die eindeutige Eigenschaft einer @Index-Annotation auf true setzen. Das folgende Codebeispiel verhindert, dass eine Tabelle über zwei Zeilen verfügt, die denselben Wertesatz für die Spalten firstName und lastName enthalten:

@Entity(indices = {@Index(value = {"first_name", "last_name"},
        unique = true)})
class User {
    @PrimaryKey
    public int id;

    @ColumnInfo(name = "first_name")
    public String firstName;

    @ColumnInfo(name = "last_name")
    public String lastName;

    @Ignore
    Bitmap picture;
}

In Ihrem Code können Sie die folgenden Änderungen vornehmen, um UNIQUE-Einschränkungen zu haben

@Entity(foreignKeys ={
        @ForeignKey(entity = Label.class, parentColumns = "_id", childColumns = "labelId", onDelete = CASCADE),
        @ForeignKey(entity = Task.class, parentColumns = "_id", childColumns = "taskId", onDelete = CASCADE)},
        indices = {@Index(value = {"labelId", "taskId"},
                unique = true)}
)
public class LabelOfTask extends Data{
    @ColumnInfo(name = "labelId")
    private Integer labelId;
    @ColumnInfo(name = "taskId")
    private Integer taskId;
}
11
lib4

Wenn Sie sich fragen, ob eine einzelne Spalte eindeutig sein soll, müssen Sie nur schreiben

@Entity(indices = {@Index(value = "name", unique = true)})
0
Ercan Duman