1

我似乎找不到解决这个奇怪错误的方法:

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

完整输出:

创建表PROFILEidINTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,userIdINTEGER NOT NULL)

创建表VERSION( idINTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, timestampINTEGER NOT NULL, vectorINTEGER NOT NULL)

创建表NAMEidINTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,firstNameTEXT NOT NULL,lastNameTEXT NOT NULL,profileIdINTEGER NOT NULL,versionIdINTEGER NOT NULL)

创建表PHONENUMBERidINTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,numberTEXT NOT NULL,kindTEXT NOT NULL,profileIdINTEGER NOT NULL,versionIdINTEGER NOT NULL)

创建表VIEW( idINTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY) 创建表PHONENUMBERS_VIEWS( phoneNumberINTEGER NOT NULL, viewINTEGER NOT NULL)

创建表CREDENTIALSidINTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,usernameTEXT NOT NULL,passwordTEXT NOT NULL,userIdINTEGER NOT NULL)

创建表USERidINTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY)

创建表API_KEYidINTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,tokenTEXT NOT NULL,deviceIdTEXT NOT NULL,credentialsIdINTEGER NOT NULL)

更改表PROFILE添加约束user_fk外键(userId)引用USERid)更新时无操作删除无操作

更新时更改表NAME添加约束profile_fk外键(profileId)引用PROFILEid)删除 CASCADE 时不操作

更改表NAME添加约束version_fk外键(versionId)引用VERSIONid)更新时无操作删除无操作

更新时更改表PHONENUMBER添加约束profile_fk外键(profileId)引用PROFILEid)删除 CASCADE 时不操作

更改表PHONENUMBER添加约束version_fk外键(versionId)引用VERSIONid)更新时无操作删除无操作

alter table PHONENUMBERS_VIEWSadd constraint phoneNumber_fkforeign key( phoneNumber) references PHONENUMBER( id) on update NO ACTION on delete NO ACTION alter table PHONENUMBERS_VIEWSadd constraint view_fkforeign key( view) references VIEW( id) on update NO ACTION on delete NO ACTION

更改表CREDENTIALS添加约束user_fk外键(userId)引用USERid)更新时无操作删除无操作

更改表API_KEY添加约束credentials_fk外键(credentialsId)引用CREDENTIALSid)更新时无操作删除无操作

` 符号由于降价而被隐藏,但在原始输出中

编辑 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)
4

1 回答 1

2

“对于 Names 会生成一个到 Profiles 的 foreignKey,而对于 PhoneNumbers 则不会。为什么?似乎没有区别?”

我认为缺乏差异是这里的问题。

您为 和 使用了相同的外键名称(“profile_fk” Names.profileFkPhoneNumbers.profileFk。MySQL 外键名称必须是唯一的。

我建议用“name_profile_fk”和“phonenumber_profile_fk”替换“profile_fk”。

但是,您应该看到一个异常。您包含的第一个 alter table 语句...

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

...是应该有例外的地方。

如果您没有看到异常,则可能是您的应用程序在您执行的未来返回之前终止。您可以通过在SlickDB().run命令周围放置等待来测试它。例如,

import scala.concurrent.Await
import scala.concurrent.duration._
Await.result(
  SlickDB().run(DBIO.seq(schema.create))
  , 10 seconds)
于 2015-05-30T15:37:31.520 回答