我似乎找不到解决这一奇怪问题的办法:
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字段组成。可标识提供id-属性。
我用的是Slick 3和MySQL。
对于名称,将生成到概要文件的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整数非空AUTO_INCREMENT主键,userId整数NULL)
创建表VERSION (id整数非空AUTO_INCREMENT主键,timestamp整数NULL,vector整数NULL)
创建表NAME (id整数不为空的AUTO_INCREMENT主键,firstName文本不为空,lastName文本不为空,profileId整数不为空,versionId整数不为空)
创建表PHONENUMBER (id整数不为空的AUTO_INCREMENT主键,number文本不为空,kind文本不为空,profileId整数不为空,versionId整数不为空)
创建表VIEW (id整数不为空AUTO_INCREMENT主键)创建表PHONENUMBERS_VIEWS (phoneNumber整数不为空,view整数不为空)
创建表CREDENTIALS (id整数非空AUTO_INCREMENT主键,username文本不为空,password文本不为空,userId整数不为空)
创建表USER (id INTEGER而非NULL AUTO_INCREMENT主键)
创建表API_KEY (id整数非空AUTO_INCREMENT主键,token文本不为空,deviceId文本不为空,credentialsId整数不为空)
alter PROFILE添加约束user_fk外键(userId)引用USER(id)更新,不对删除操作执行操作
alter NAME添加约束profile_fk外键(profileId)引用PROFILE(id)更新时不执行删除级联操作
alter NAME添加约束version_fk外键(versionId)引用VERSION(id)更新,不对删除操作执行操作
alter PHONENUMBER添加约束profile_fk外键(profileId)引用PROFILE(id)更新时不执行删除级联操作
alter PHONENUMBER添加约束version_fk外键(versionId)引用VERSION(id)更新,不对删除操作执行操作
alter PHONENUMBERS_VIEWS添加约束phoneNumber_fk外键(phoneNumber)引用PHONENUMBER(id)在更新时不对删除操作执行任何操作更改表PHONENUMBERS_VIEWS添加约束view_fk外键(view)引用VIEW(id)在更新时不对删除操作执行任何操作
alter CREDENTIALS添加约束user_fk外键(userId)引用USER(id)更新,不对删除操作执行操作
alter 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)发布于 2015-05-30 15:37:31
“对于名字,生成foreignKey to Profiles,而PhoneNumbers不生成。为什么?似乎没有区别?”
我认为缺乏差别是这里的问题。
您对Names.profileFk和PhoneNumbers.profileFk使用了相同的外键名称(“Names.profileFk”)。MySQL外键名称必须是唯一的。
我建议将"profile_fk“改为"name_profile_fk”和"phonenumber_profile_fk“。
但是,您应该看到一个异常。你包括的第一个alter语句..。
alter table NAME add constraint profile_fk foreign key(profileId) references PROFILE(id) on update NO ACTION on delete CASCADE..。应该没问题,但是第二个.
alter table PHONENUMBER add constraint profile_fk foreign key(profileId) references PROFILE(id) on update NO ACTION on delete CASCADE应该有异常的...is。
如果您没有看到异常,那么您的应用程序可能会在执行返回之前终止。您可以通过在SlickDB().run命令周围放置一个等待命令来测试这一点。例如,
import scala.concurrent.Await
import scala.concurrent.duration._
Await.result(
SlickDB().run(DBIO.seq(schema.create))
, 10 seconds)https://stackoverflow.com/questions/30267158
复制相似问题