Составные ключевые отношения в комнате - PullRequest
0 голосов
/ 25 мая 2020

Я получаю сообщение об ошибке

error: BookGroupEntry has a foreign key (bookGroupParameterId) that references BookGroupParameter (id) but BookGroupParameter does not have a unique index on those columns nor the columns are its primary key. SQLite requires having a unique constraint on referenced parent columns so you must add a unique index to BookGroupParameter that has (id) column(s).

, и это совершенно меня поражает, потому что у меня нет ситуации, о которой сообщает ошибка

Моя таблица BookGroupParameter выглядит следующим образом:

@Entity(
    tableName = "BookGroupParameters",
    primaryKeys = ["id", "parameterId", "bookGroupId"],
    indices = [Index("id")],
    foreignKeys = [
        ForeignKey(
            entity = Parameter::class,
            parentColumns = arrayOf("id"),
            childColumns = arrayOf("parameterId"),
            onDelete = ForeignKey.CASCADE
        ),

        ForeignKey(
            entity = BookGroup::class,
            parentColumns = arrayOf("id"),
            childColumns = arrayOf("bookGroupId"),
            onDelete = ForeignKey.CASCADE
        )]
)
data class BookGroupParameter(
    @NonNull
    var id: Int,
    val bookGroupId: Int,
    val parameterId: Int
) {
}

, а это моя таблица BookGroupEntry

@Entity(
    tableName = "BookGroupEntries",foreignKeys = [
        ForeignKey(
            entity = BookGroupParameter::class,
            parentColumns = arrayOf("id"),
            childColumns = arrayOf("bookGroupParameterId"),
            onDelete = ForeignKey.CASCADE
        )]
)
data class BookGroupEntry(
    @PrimaryKey
    var id: Int,
    var value: String,
    val bookGroupParameterId:Int
)

Почему он сообщает мне, что мой FK в BookGroupEntry не определен как PK в таблице BookGroupParameters?

1 Ответ

1 голос
/ 25 мая 2020

На мой взгляд, сообщение об ошибке имеет смысл:

  • Индекс («id») действительно не является уникальным индексом
  • Столбец «id» не является первичным ключом в таблице BookGroupParameter ( поскольку его первичный ключ является составным, как вы написали)

Чтобы избавиться от ошибки, вы можете:

  1. Сделать индекс в таблице BookGroupParameter уникальным :
    indices = [Index("id", unique = true)]
Чтобы поместить составной первичный ключ BookGroupParameter в BookGroupEntry :
@Entity(
    tableName = "BookGroupEntries",foreignKeys = [
        ForeignKey(
            entity = BookGroupParameter::class,
            parentColumns = arrayOf("id","bookGroupId","parameterId"),
            childColumns = arrayOf("bookGroupParameterId","bookGroupParameterBookGroupId","bookGroupParameterParameterId"), // changed
            onDelete = ForeignKey.CASCADE
        )]
)
data class BookGroupEntry(
    @PrimaryKey
    var id: Int,
    var value: String,
    val bookGroupParameterId:Int,
    val bookGroupParameterBookGroupId:Int, // added
    val bookGroupParameterParameterId:Int // added
)
...