首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Slick 3- ForeignKeys不生成

Slick 3- ForeignKeys不生成
EN

Stack Overflow用户
提问于 2015-05-15 19:15:41
回答 1查看 709关注 0票数 1

我似乎找不到解决这一奇怪问题的办法:

代码语言:javascript
运行
复制
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。为什么?好像没什么区别吗?

更新:

有关声明如下:

代码语言:javascript
运行
复制
create table `PHONENUMBER` (`id` INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,`number` TEXT NOT NULL,`kind` TEXT NOT NULL,`profileId` INTEGER NOT NULL)

和:

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-30 15:37:31

“对于名字,生成foreignKey to Profiles,而PhoneNumbers不生成。为什么?似乎没有区别?”

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

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

我建议将"profile_fk“改为"name_profile_fk”和"phonenumber_profile_fk“。

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

代码语言:javascript
运行
复制
alter table NAME add constraint profile_fk foreign key(profileId) references PROFILE(id) on update NO ACTION on delete CASCADE

..。应该没问题,但是第二个.

代码语言:javascript
运行
复制
alter table PHONENUMBER add constraint profile_fk foreign key(profileId) references PROFILE(id) on update NO ACTION on delete CASCADE

应该有异常的...is。

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

代码语言:javascript
运行
复制
import scala.concurrent.Await
import scala.concurrent.duration._
Await.result(
  SlickDB().run(DBIO.seq(schema.create))
  , 10 seconds)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30267158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档