我似乎找不到解决这个奇怪错误的方法:
class Names(tag: Tag) extends Table[Name](tag, "NAME") with Identifiable[Name]{
def firstName = column[String]("firstName")
def lastName = column[String]("lastName")
def profileId = column[Int]("profileId")
def * = (id.?, firstName, lastName, profileId) <> ((Name.apply _).tupled, Name.unapply)
def profileFk = foreignKey("profile_fk", profileId, TableQuery[Profiles])(_.id, onDelete=ForeignKeyAction.Cascade)
}
class PhoneNumbers(tag: Tag) extends Table[PhoneNumber](tag, "PHONENUMBER") with Identifiable[PhoneNumber] {
def number = column[String]("number")
def kind = column[String]("kind")
def profileId = column[Int]("profileId")
def * = (id.?, number, kind, profileId) <> ((PhoneNumber.apply _).tupled, PhoneNumber.unapply)
def profileFk = foreignKey("profile_fk", profileId, TableQuery[Profiles])(_.id, onDelete=ForeignKeyAction.Cascade)
}
并且配置文件类仅包含一个 id 字段。Identifiable 提供 id 属性。
我将 Slick 3 与 MySQL 一起使用。
对于 Names,生成 Profiles 的 foreignKey,对于 PhoneNumbers 则不生成。为什么?好像没什么区别?
更新:
以下是相关声明:
create table `PHONENUMBER` (`id` INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,`number` TEXT NOT NULL,`kind` TEXT NOT NULL,`profileId` INTEGER NOT NULL)
和:
alter table `PHONENUMBER` add constraint `profile_fk` foreign key(`profileId`) references `PROFILE`(`id`) on update NO ACTION on delete CASCADE
完整输出:
创建表PROFILE
(id
INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,userId
INTEGER NOT NULL)
创建表VERSION
( id
INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, timestamp
INTEGER NOT NULL, vector
INTEGER NOT NULL)
创建表NAME
(id
INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,firstName
TEXT NOT NULL,lastName
TEXT NOT NULL,profileId
INTEGER NOT NULL,versionId
INTEGER NOT NULL)
创建表PHONENUMBER
(id
INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,number
TEXT NOT NULL,kind
TEXT NOT NULL,profileId
INTEGER NOT NULL,versionId
INTEGER NOT NULL)
创建表VIEW
( id
INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY) 创建表PHONENUMBERS_VIEWS
( phoneNumber
INTEGER NOT NULL, view
INTEGER NOT NULL)
创建表CREDENTIALS
(id
INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,username
TEXT NOT NULL,password
TEXT NOT NULL,userId
INTEGER NOT NULL)
创建表USER
(id
INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY)
创建表API_KEY
(id
INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,token
TEXT NOT NULL,deviceId
TEXT NOT NULL,credentialsId
INTEGER NOT NULL)
更改表PROFILE
添加约束user_fk
外键(userId
)引用USER
(id
)更新时无操作删除无操作
更新时更改表NAME
添加约束profile_fk
外键(profileId
)引用PROFILE
(id
)删除 CASCADE 时不操作
更改表NAME
添加约束version_fk
外键(versionId
)引用VERSION
(id
)更新时无操作删除无操作
更新时更改表PHONENUMBER
添加约束profile_fk
外键(profileId
)引用PROFILE
(id
)删除 CASCADE 时不操作
更改表PHONENUMBER
添加约束version_fk
外键(versionId
)引用VERSION
(id
)更新时无操作删除无操作
alter table PHONENUMBERS_VIEWS
add constraint phoneNumber_fk
foreign key( phoneNumber
) references PHONENUMBER
( id
) on update NO ACTION on delete NO ACTION alter table PHONENUMBERS_VIEWS
add constraint view_fk
foreign key( view
) references VIEW
( id
) on update NO ACTION on delete NO ACTION
更改表CREDENTIALS
添加约束user_fk
外键(userId
)引用USER
(id
)更新时无操作删除无操作
更改表API_KEY
添加约束credentials_fk
外键(credentialsId
)引用CREDENTIALS
(id
)更新时无操作删除无操作
` 符号由于降价而被隐藏,但在原始输出中
编辑 2:
val profiles = TableQuery[Profiles]
val names = TableQuery[Names]
val phoneNumbers = TableQuery[PhoneNumbers]
val views = TableQuery[Views]
val phoneNumbersToViews = TableQuery[PhoneNumbersToViews]
val users = TableQuery[Users]
val credentials = TableQuery[CredentialsSchema]
val apiKeys = TableQuery[ApiKeys]
val versions = TableQuery[Versions]
val schema = profiles.schema ++
versions.schema ++
names.schema ++
phoneNumbers.schema ++
views.schema ++
phoneNumbersToViews.schema ++
credentials.schema ++
users.schema ++
apiKeys.schema
SlickDB().run(DBIO.seq(
schema.create
))
schema.createStatements.foreach(println)