web-dev-qa-db-fra.com

ajouter une contrainte unique dans la base de données de la pièce à plusieurs colonnes

J'ai une entité dans la chambre

@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;
}

la syntaxe SQL de cette entité est la suivante

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
 );

mais quel changement ou annotation je dois ajouter à la classe d'entité si je veux ajouter la contrainte ci-dessous au schéma SQL généré automatiquement de la table

unique (labelId, taskId)

En fin de compte, je souhaite que la combinaison de labelId et de taskId soit unique dans une table (ou entité de salle) à l'aide de la bibliothèque de salles.

7
Kevan

Une contrainte UNIQUE simple sur une colonne, autre que via un index, n'est pas prise en charge.

Vous pouvez appliquer cette propriété d'unicité en définissant la propriété unique d'une annotation @Index sur true. L'exemple de code suivant empêche une table d'avoir deux lignes contenant le même ensemble de valeurs pour les colonnes firstName et lastName:

@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;
}

Dans votre code, vous pouvez effectuer les modifications suivantes pour avoir des contraintes UNIQUE.

@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

Si vous souhaitez créer une seule colonne unique, il vous suffit d'écrire

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